把整数排成最小的数——剑指offer面试题33
题目:输入一个正整数数组,把数组中所有的数拼接成一个整数,输出最小的整数。
思路:设计一种新的比较规则来排序一个数组,证明这个比较规则有效。
(1)两个数m,n,如果mn<nm,则说明m << n。证明按这个顺序排序得到的数是最小的数。
即如如果x1 << x2 << x3 << x4,则x1x2x3x4是最小的数。
证明:假如任意交换其中的2个数x2和x4,x1x2x3x4x5<<x1x2x4x3x5<<x1x4x2x3x5<<x1x4x3x2x5.
(2)为了方便排序,证明了这个排序方法还有一个传递性,即若a<<b,b<<c,则a<<c。
(3)为了避免大数的溢出问题,可以采用字符串的方法进行比较。
qsort:void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
参数: 1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
//输入一个正整数数组,把数组中的而所有数字拼接起来组成一个最小的整数。 #include<string.h> #include<stdio.h> #include<stdlib.h> //qsort需要的头文件 const int g_MaxNumberLength=10; char* g_strConbine1=new char[g_MaxNumberLength*2+1]; char* g_strConbine2=new char[g_MaxNumberLength*2+1]; int compare(const void* strNumber1,const void*strNumber2) // { strcpy(g_strConbine1,*(const char**)strNumber1); strcat(g_strConbine1,*(const char**)strNumber2); strcpy(g_strConbine1,*(const char**)strNumber2); strcat(g_strConbine1,*(const char**)strNumber1); return strcmp(g_strConbine1,g_strConbine2); } void PrintMinNumber(int* numbers,int length) { if(numbers==NULL||length<=0) return; char** strNumbers=(char**)(new int[length]); //new int[length]用来存储cahr*型指针 for(int i=0;i<length;i++) { strNumbers[i]=new char[g_MaxNumberLength+1]; //strNumbers[i]为char*型指针 sprintf(strNumbers[i],"%d",numbers[i]); } qsort(strNumbers,length,sizeof(char*),compare); //void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *)); for(int i=0;i<length;i++) printf("%s",strNumbers[i]); printf("\n"); for(int i=0;i<length;i++) delete [] strNumbers[i]; delete[] strNumbers; } int numbers[3]={3,321,32}; void main() { PrintMinNumber(numbers,3); }