這道題比較簡單,但通過這個題我學會了使用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; }