# String# Sorting# Comparison

a528 - 大數排序

🔗 前往 ZeroJudge 原題

題目描述

題目要求讀取一組數字(以字串形式表示),並按照從小到大的順序輸出這些數字。數字可能很大,超出一般整數型態的範圍,因此需要以字串形式處理。

解題思路

由於數字可能非常大,無法使用標準的整數排序方法。因此,將數字儲存為字串,然後使用自定義的比較函數進行排序。比較函數首先比較字串的長度,長度較短的字串較小。如果長度相同,則逐字比較字串的每個字符,直到找到不同的字符為止。對於負數,比較函數需要考慮負號,並按照數值大小進行比較。程式碼中,先讀取數字並儲存到字串陣列中,然後使用冒泡排序演算法對字串陣列進行排序。

複雜度分析

  • 時間複雜度: O(n^2),其中 n 是數字的個數。這是因為使用了冒泡排序演算法。
  • 空間複雜度: O(n),其中 n 是數字的個數。這是因為需要儲存字串陣列。

程式碼

#include <iostream>
#include <string>
using namespace std;
int main(){
	std::ios::sync_with_stdio(false);
    std::cin.tie(0);
	int a;
	while(cin >> a){
		string b[a],tem;
		int c[a],tmp;
		for(int i=0;i<a;i++){
			cin >> b[i];
			if(b[i][0]=='-'){
				c[i]=-b[i].length();
			}
			else{
				c[i]=b[i].length();
			}
		}
		for(int i=0;i<a;i++){
			for(int j=i+1;j<a;j++){
				if(c[i]>c[j]){
					tmp=c[i];
					c[i]=c[j];
					c[j]=tmp;
					tem=b[i];
					b[i]=b[j];
					b[j]=tem;
				}
				else if(c[i]==c[j]&&c[i]>0){
					for(int k=0;k<b[i].length();k++){
						if(b[i][k]>b[j][k]){
							tem=b[i];
							b[i]=b[j];
							b[j]=tem;
						} 
					}
				}
				else if(c[i]==c[j]&&c[i]<0){
					for(int k=0;k<b[i].length();k++){
						if(b[i][k]<b[j][k]){
							tem=b[i];
							b[i]=b[j];
							b[j]=tem;
						} 
					}
				}
			}
		}
		for(int i=0;i<a;i++){
			cout << b[i] << endl;
		}
	}
}

Discussion