把数组排成最小的数

来源:互联网 发布:北京java学费 编辑:程序博客网 时间:2024/06/16 01:14

输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32,  321},则输出这两个能排成的最小数字32132请给出解决问题的算法,并证明该算法。

首先因为数组可能非常长,所以要定义一个整数类,使得其大小可以容纳所有的数组元素组成的数不大现实。因此我们直接输出这个数组,让其看起来像一个整数,这样我们就可以把问题转化为:如何给这个数组排序,使其看做一个数字的时候最小。

第一个想到的可能是按字典序排序,小的在前面。可惜这个是不可行的,比如32的字典序比322小,但是32322比32232大,

所以在这里自定义一个比较大小的函数,比较两个字符串s1, s2大小的时候,先将它们拼接起来,比较s1+s2,和s2+s1那个大,如果s1+s2大,那说明s2应该放前面,所以按这个规则,s2就应该排在s1前面。

如果用char *表示字符串,那就可以使用qsort函数进行排序了,我这里用的是string,所以自定义了一个最简单的冒泡排序。


[cpp] view plaincopy
  1. #include<iostream>  
  2. #include<algorithm>  
  3. #include<string>  
  4. #include<sstream>  
  5. using namespace std;  
  6.   
  7. int compare1(string str1,string str2)//自定义的比较大小的函数,str1 "小"的话,返回true  
  8. {   //if(str1>=str2) then str1+str2 >=str2+str1  
  9.     string tmp1 = str1.append(str2);  
  10.     string tmp2 = str2.append(str1);  
  11.     //cout<<tmp1<<" "<<tmp2<<endl;  
  12.     if(tmp1.compare(tmp2)<0)//  
  13.         return true;  
  14.     return false;  
  15. }  
  16.   
  17. int main()  
  18. {     
  19.     int num[] = {332,41,322,32,414,4};  
  20.     int len = sizeof(num)/sizeof(int);  
  21.     cout<<"len = "<<len<<endl;  
  22.     string *word = new string[len];  
  23.     stringstream sst;  
  24.     for(int i=0;i<len;i++)//讲int整数转化成字符串  
  25.     {  
  26.         sst<<num[i];  
  27.         sst>>word[i];  
  28.         sst.clear();  
  29.     }  
  30.     cout<<endl;  
  31.     sort(word,word+len,compare1);//利用泛型算法排序  
  32.     for(int i=0;i<len;i++)  
  33.     {  
  34.         cout<<word[i];  
  35.     }  
  36.     getchar();  
  37.     return 0;  
  38. }  

原创粉丝点击