# Sorting# Greedy# Array

a915 - 二维点排序

🔗 前往 ZeroJudge 原題

題目描述

題目要求將給定的 n 個二维平面上的點,按照 x 座標為第一關鍵字,y 座標為第二關鍵字的方式從小到大進行排序,並輸出排序後的點的座標。

解題思路

此題的核心是實現一個排序演算法。程式碼使用了一個簡單的冒泡排序來對點進行排序。排序的依據是先比較 x 座標,如果 x 座標相同,則比較 y 座標。對於每個點,程式碼會與後面的點進行比較,如果 x 座標大於後面的點的 x 座標,或者 x 座標相同但 y 座標大於後面的點的 y 座標,則交換兩個點的位置。這個過程會重複進行,直到所有點都按照指定的順序排列。

複雜度分析

  • 時間複雜度: O(n^2) (由於使用了冒泡排序)
  • 空間複雜度: O(n) (用於儲存點的陣列)

程式碼

#include <iostream>
using namespace std;
int main(){
	std::ios::sync_with_stdio(false);
    std::cin.tie(0);
	int a,tem;
	while(cin >> a){
		int b[2][a];
		for(int i=0;i<a;i++){
			cin >> b[0][i] >> b[1][i];
		}
		for(int i=0;i<a;i++){
			for(int j=i+1;j<a;j++){
				if(b[0][i]>b[0][j]){
					tem=b[1][i];
					b[1][i]=b[1][j];
					b[1][j]=tem;
					tem=b[0][i];
					b[0][i]=b[0][j];
					b[0][j]=tem;
				}
				else if(b[0][i]==b[0][j]&&b[1][i]>b[1][j]){
					b[0][i]=b[1][i];
					b[1][i]=b[1][j];
					b[1][j]=b[0][i];
					b[0][i]=b[0][j];
				}
			}
		}
		for(int i=0;i<a;i++){
			cout << b[0][i] << " " << b[1][i] << "\n";
		}
	}
}

Discussion