//把数组排成最大的数(数组、算法)。 //题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最大的一个。 //例如输入数组{32, 321},则输出这两个能排成的最大数字32321.。 //或者输入数组{10,9,33,1000}输出这四个能排列的最大数字933101000. #include <iostream> #define MAXSIZE 100 using namespace std; template<typename T> class Grial { public: int Length(int x,int& n) { n++; (x/10)&& (Length(x/=10,n)); return n; }//求数字的位数。 bool Complate(int x,int y)//比较x,y的大小,是组合排列大小,看xy比yx的大小,从而好形成大堆。 { int _I = 0; int i = 0; int j = 0; int sum_1=x; int sum_2=y; Length(x,i); Length(y,j); for(;_I<j;_I++) { sum_1*=10; } for(_I=0;_I<i;_I++) { sum_2*=10; } if((sum_1+y)>(sum_2+x))return true; else return false; } Grial(T a[],int n) { data = new T[n]; size = n; for(int i=0;i<n;i++) { data[i] = a[i]; } int m = size/2; while(m<size) { MaxSort(m); m++; } } void MaxSort(int n)//大堆排列 { int temp; int i=n; int j=(i-1)/2; while(i>0) { if(!Complate(data[j],data[i])) { temp = data[i]; data[i]=data[j]; data[j]=temp; } i = j; j = (i-1)/2; } } int GetTop()//得到大堆第一个元素,并且将最后面一个元算放在下标为0的位置,再进行大堆排序. { if(size==0)return -1; int temp = data[0]; data[0] = data[size-1]; size--; int m = size/2; while(m<size) { MaxSort(m); m++; } return temp; } void GetSum() { int i = GetTop(); if(i!=-1) { cout<<i; GetSum(); } }//输出数据. private: T *data; int size; }; int main() { int a[]={1,9,100001,1001111,98}; Grial<int> G(a,5); //结果是99811001111100001满足最大排列组合. G.GetSum(); cout<<endl; return 0; }
时间: 2024-10-11 11:03:17