C語言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問題解決
問題描述:輸入一個正整數(shù)數(shù)組,將它們連接起來排成一個數(shù),輸出能排出的所有數(shù)字中最小的一個。例如輸入數(shù)組{32, 321},則輸出這兩個能排成的最小數(shù)字32132。請給出解決問題的算法,并證明該算法。
思路:先將整數(shù)數(shù)組轉(zhuǎn)為字符串?dāng)?shù)組,然后字符串?dāng)?shù)組進(jìn)行排序,最后依次輸出字符串?dāng)?shù)組即可。這里注意的是字符串的比較函數(shù)需要重新定義,不是比較a和b,而是比較ab與 ba。如果ab < ba,則a < b;如果ab > ba,則a > b;如果ab = ba,則a = b。比較函數(shù)的定義是本解決方案的關(guān)鍵。
證明:為什么這樣排個序就可以了呢?簡單證明一下。根據(jù)算法,如果a < b,那么a排在b前面,否則b排在a前面。可利用反證法,假設(shè)排成的最小數(shù)字為xxxxxx,并且至少存在一對字符串滿足這個關(guān)系:a > b,但是在組成的數(shù)字中a排在b前面。根據(jù)a和b出現(xiàn)的位置,分三種情況考慮:
(1)xxxxab,用ba代替ab可以得到xxxxba,這個數(shù)字是小于xxxxab,與假設(shè)矛盾。因此排成的最小數(shù)字中,不存在上述假設(shè)的關(guān)系。
(2)abxxxx,用ba代替ab可以得到baxxxx,這個數(shù)字是小于abxxxx,與假設(shè)矛盾。因此排成的最小數(shù)字中,不存在上述假設(shè)的關(guān)系。
(3)axxxxb,這一步證明麻煩了一點??梢詫⒅虚g部分看成一個整體ayb,則有ay < ya,yb < by成立。將ay和by表示成10進(jìn)制數(shù)字形式,則有下述關(guān)系式,這里a,y,b的位數(shù)分別為n,m,k。
關(guān)系1: ay < ya => a * 10^m + y < y * 10^n + a => a * 10^m - a < y * 10^n - y => a( 10^m - 1)/( 10^n - 1) < y
關(guān)系2: yb < by => y * 10^k + b < b * 10^m + y => y * 10^k - y < b * 10^m - b => y < b( 10^m -1)/( 10^k -1)
關(guān)系3: a( 10^m - 1)/( 10^n - 1) < y < b( 10^m -1)/( 10^k -1) => a/( 10^n - 1)< b/( 10^k -1) => a*10^k - a < b * 10^n - b =>a*10^k + b < b * 10^n + a => a < b
這與假設(shè)a > b矛盾。因此排成的最小數(shù)字中,不存在上述假設(shè)的關(guān)系。
綜上所述,得出假設(shè)不成立,從而得出結(jié)論:對于排成的最小數(shù)字,不存在滿足下述關(guān)系的一對字符串:a > b,但是在組成的數(shù)字中a出現(xiàn)在b的前面。從而得出算法是正確的。
參考代碼:
//重新定義比較函數(shù)對象
struct compare
{
bool operator() (const string &src1, const string &src2)
{
string s1 = src1 + src2;
string s2 = src2 + src1;
return s1 < s2; //升序排列,如果改為s1 > s2則為逆序排列
}
};
//函數(shù)功能 : 把數(shù)組排成最小的數(shù)
//函數(shù)參數(shù) : pArray為數(shù)組,num為數(shù)組元素個數(shù)
//返回值 : 無
void ComArrayMin(int *pArray, int num)
{
int i;
string *pStrArray = new string[num];
for(i = 0; i < num; i++) //將數(shù)字轉(zhuǎn)換為字符串
{
stringstream stream;
stream<<pArray[i];
stream>>pStrArray[i];
}
sort(pStrArray, pStrArray + num, compare()); //字符串?dāng)?shù)組排序
for(i = 0; i < num; i++) //打印字符串?dāng)?shù)組
cout<<pStrArray[i];
cout<<endl;
delete [] pStrArray;
}
上一篇:二分查找算法在C/C++程序中的應(yīng)用示例
欄 目:C語言
下一篇:詳解C語言中fseek函數(shù)和ftell函數(shù)的使用方法
本文標(biāo)題:C語言將數(shù)組中元素的數(shù)排序輸出的相關(guān)問題解決
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2426.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery


