把数组排成最小的数。
68.把数组排成最小的数。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
分析:这是09年6月份百度的一道面试题,
从这道题我们可以看出百度对应聘者在算法方面有很高的要求。
[cpp]
/*
Name:
Copyright:
Author:
Date: 25-06-11 15:19
Description: 把数组排成最小的数(数组、算法)。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中
最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
*/
#include<iostream>
#include<iomanip>
using namespace std;
#define N 10 //总共有N个整数
bool cmp_min(char *s1,char *s2)
//算法保证,s1、s2都不是空串
{
const int slen1=strlen(s1);
const int slen2=strlen(s2);
char *tc=(char *)malloc(slen1+slen2+1);//只开辟一个空间
int i;
for(i=0;i<slen2;++i)
tc[i]=s2[i];
for(;i<slen1+slen2;++i)
tc[i]=s1[i-slen2];
tc[i]='\0';
for(i=0;i<slen1;++i)
{
if(s1[i]==tc[i])
continue;
else
{
if(s1[i]>tc[i])
return false;
else
return true;
}
}
for(;i<slen1+slen2;++i)
{
if(s2[i-slen1]==tc[i])
continue;
else
{
if(s1[i-slen1]>tc[i])
return false;
else
return true;
}
}
return false;
}
int sort_partition(char *s[],int p,int r)
{
char *x=s[r];
int i=p-1;
int j;
char *tem;
for(j=p;j<r;++j)
{
if(cmp_min(s[j],x))
{
tem=s[++i];
s[i]=s[j];
s[j]=tem;
}
}
tem=s[++i];
s[i]=x;
s[r]=tem;
return i;
}
void quick_sort(char *s[],int p,int r)
{
int m;
if(p<r)
{
m=sort_partition(s,p,r);
quick_sort(s,p,m-1);
quick_sort(s,m+1,r);
}
}
int main()
{
//z总共有N个整数
int a[N]={123,43,565,1,67,234,9012,1056,2056,2249};
char *s[N];//指针数组
for(int i=0;i<N;++i)
{//转换为N个字符串
s[i]=(char *)malloc(sizeof(char)*12);
//一个整数用11为来表示
itoa(a[i],s[i],10);
//包含'\0'
}
for(int i=0;i<N;i++)
{
cout<<s[i]<<" ";
}
quick_sort(s,0,9);
cout<<endl;
for(int i=0;i<N;i++)
{
cout<<s[i]<<" ";
}
system("pause");
return 0;
}
/*
Name:
Copyright:
Author:
Date: 25-06-11 15:19
Description: 把数组排成最小的数(数组、算法)。
题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中
最小的一个。
例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
请给出解决问题的算法,并证明该算法。
*/
#include<iostream>
#include<iomanip>
using namespace std;
#define N 10 //总共有N个整数
bool cmp_min(char *s1,char *s2)
//算法保证,s1、s2都不是空串
{
const int slen1=strlen(s1);
const int slen2=strlen(s2);
char *tc=(char *)malloc(slen1+slen2+1);//只开辟一个空间
int i;
for(i=0;i<slen2;++i)
tc[i]=s2[i];
for(;i<slen1+slen2;++i)
tc[i]=s1[i-slen2];
tc[i]='\0';
for(i=0;i<slen1;++i)
{
if(s1[i]==tc[i])
continue;
else
{
if(s1[i]>tc[i])
return false;
else
return true;
}
}
for(;i<slen1+slen2;++i)
{
if(s2[i-slen1]==tc[i])
continue;
else
{
if(s1[i-slen1]>tc[i])
return false;
else
补充:软件开发 , C++ ,