1.把数组转换为字符串数组,sprinf到字符串数组
2.对字符串数组进行排序,排序规则compare是:两个元素拼接到一块比大小,按从小到大排列
3.快排字符串数组,然后依次输出字符串数组中的元素即可
注:
1:qsort()
头文件:stdlib.h
用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));
其中comp函数应写为:
1
2
3
4
|
intcomp(constvoid*a,constvoid*b)
{
return
*(
int
*)a-*(
int
*)b;
}
|
// 33.cpp : 定义控制台应用程序的入口点。
//剑指offer33,把数组排成最小的数
//{3,32,321}打印出最小的数字321323
#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int g_MaxNumLen = 10;//两个数中最大数的长度
//定义两个字符串用于比较
char* g_strCombine1 = new char[g_MaxNumLen*2 +1];
char* g_strCombine2 = new char[g_MaxNumLen*2 +1];
int compare(const void* strNumber1,const void* strNumber2 )
{
strcpy(g_strCombine1,*(const char**)strNumber1);
strcat(g_strCombine1,*(const char**)strNumber2);
strcpy(g_strCombine2,*(const char**)strNumber2);
strcat(g_strCombine2,*(const char**)strNumber1);
return strcmp(g_strCombine1,g_strCombine2);
}
void PrintMinNumber(int* arr,int length)
{
if(arr == NULL || length <0)
return;
char** strNumbers = (char**)(new int[length]);
//把数组读入字符串数组
for(int i =0;i<length;++i)
{
strNumbers[i]=new char[g_MaxNumLen+1];
sprintf(strNumbers[i],"%d",arr[i]);
}
qsort(strNumbers,length,sizeof(char*),compare);
for(int i =0;i<length;++i)
{
cout << strNumbers[i];
}
//释放
for(int i =0;i<length;++i)
delete[] strNumbers[i];
delete[] strNumbers;
}
int _tmain(int argc, _TCHAR* argv[])
{
int i;
int length;
cin >>length;
cin.clear();
int *arr = new int[length];
for(i=0;i<length;i++)
{
cin >> arr[i];
}
PrintMinNumber(arr,length);
delete [] arr;
system("pause");
return 0;
}