這道題比較簡單,但通過這個題我學會了使用c++內置的qsort函數用法,收獲還是很大的! 首先簡要介紹一下qsort函數。 1、它是快速排序,所以就是不穩定的。(不穩定意思就是張三、李四成績都是90,張三成績在前;排序完畢後有可能變成李四的90在前,張三在後) 2、需要包含頭文件:cstdlib 3、原型:void qsort(void *base,int nelem,int width,int(*fcmp)(const void*,const void *)); 4、參數:數組首地址,數組內元素數量,每個元素占用空間大小,指向函數的指針 這道題意思是給出一個字符串,從該字符串首字母開始判斷在其右邊有多少個字母比他小,直到判斷玩整個序列得出這個字符串的一個value。如“BAAED”,B比右側的A(2個)大,E比D大,所以最後這條的value就是3。然後輸入若干條字符串,按照value最低到高排序後輸出,如果value相同則按輸入的順序輸出。 這時可能會想既然value相同時要按輸入的順序輸出,那麼快速排序肯定就是不行的了,因為它不穩定嘛。這就是這個題一個比較巧妙的地方,我把字符串的value值乘以1000後再加上該字符串是第幾個輸入進來的i,構成排序時所比較的數字num[]。因為題目規定最多輸入100條字符串,所以value大的串勢必num要大,即使value相同的串,先輸入的串的i要小,所以其num也就要小,這麼一來既把字符串與它的value綁定,又避免出現相同數字比較大小的情況,所以快排就一點問題都沒有啦!
/**
*poj1007
*@author monkeyduck
*@2013.9.21
*/
#include<iostream>
#include<cstdlib>
using namespace std;
char str[110][55];
int num[100];
int cmp(const void* a,const void* b)
{
return *(int*)a-*(int*)b;
}
int main()
{
int n,m;
cin>>n>>m;
for (int i=0;i<m;i++)
{
cin>>str[i];
int count=0;
for (int j=0;j<n-1;j++)
{
for (int k=j+1;k<n;k++)
{
if (str[i][j]>str[i][k]) count++;
}
}
num[i]=count*1000+i;
}
qsort(num,m,sizeof(num[0]),cmp);
for (int q=0;q<m;q++)
{
cout<<str[num[q]%1000]<<endl;
}
return 0;
}