程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj1007 qsort快排

poj1007 qsort快排

編輯:C++入門知識

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

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved