# Sorting# Vector# Standard Library

d550 - 物件排序

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一個 N x M 的矩陣,並按照行優先的順序進行排序。排序的規則是先比較第一列,如果相同則比較第二列,以此類推,直到比較完所有列。

解題思路

題目要求對一個二維陣列進行排序,排序的依據是逐列比較。最直接的方法是使用 C++ 的 std::sort 函數,並配合 vector 儲存二維陣列。std::sort 預設會使用小於運算符 < 進行比較,因此可以直接對 vector<vector<long long int>> 進行排序,它會自動按照行優先的順序進行比較。

複雜度分析

  • 時間複雜度: O(N * M * log N),其中 N 是行數,M 是列數。std::sort 的時間複雜度是 O(N * log N),而每次比較兩個行需要 O(M) 的時間。
  • 空間複雜度: O(N * M),用於儲存輸入的二維陣列。

程式碼

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main (){
	//ios::sync_with_stdio(0);cin.tie(0);
	long long int a,b,tem;
	while(cin >> a >> b){
		vector<vector<long long int> > c;//高=a,寬=b
		vector<long long int> d;
		c.resize(a); 
		d.resize(b);
		for(int i=0;i<a;i++){
			for(int j=0;j<b;j++){
				scanf("%lld",&d[j]);
			}
			c[i]=d;
		}
		printf("\n");
		//------------------------------
		/*	for(int i=0;i<a;i++){
				for(int j=a-(a-i)+1;j<a;j++){
					for(int l=0;l<b;l++){
						if(c[i][l]>c[j][l]){
							for(int k=0;k<b;k++){
								tem=c[i][k];
								c[i][k]=c[j][k];
								c[j][k]=tem;
							}
						}
					}
				}
			}*/
			
			
		sort(c.begin(),c.end());

		//------------------------------
		for(int i=0;i<a;i++){
			for(int j=0;j<b;j++){
				printf("%lld ",c[i][j]);
			}
			printf("\n");
		}
	}
	
}

Discussion