天天看點

【c語言】利用庫函數進行快速排序(升)

  1. 題目描述:

    C/C++中有一個快速排序的标準庫函數 qsort,在stdlib.h 中聲明,其原型為: 

    void qsort(void *base,int nelem, unsigned int width,int (*pfCompare)( const void *, const void *)); 

    其中base為待排序資料,nelem為元素數目,width為每個元素長度,機關為位元組,pfCompare為一個比較函數。 

    根據qsort 函數的用法規定,“比較函數”的原型應是: 

    int 函數名(const void * elem1, const void * elem2); 

    如果* elem1 應該排在 * elem2 前面,則函數傳回值是負整數; 

    如果* elem1 應該排在 * elem2 後面,則函數傳回值是正整數; 

    如果* elem1和* elem2順序無所謂,則函數傳回0。 

    請程式設計實作調用該庫函數,實作一個較大整數數組的增序快速排序。

    題目要求:

    輸入——第一行為整數元素數目N, 第二行為N個整數,用空格分隔。

    輸出——N個從小到大排好的整數,用空格分開。

    #include <stdio.h>

    #include <stdlib.h>
    
    int compare(constvoid *a,const void *b)// 定義不是任何類型的指針常量,但是可以是任何類型的指針。
    {
        return *(int *)a - *(int *)b;
        //如果* elem1 應該排在 * elem2 前面,則函數傳回值是負整數;
        //如果* elem1 應該排在 * elem2 後面,則函數傳回值是正整數;
        //如果* elem1和* elem2順序無所謂;
    }
    
    int main()//主函數
    {
        int i,N;
        scanf("%d",&N);//讀入需要排序數組中的元素數目
        int a[N];
        for(i=0;i<N;i++)
        {
            scanf("%d",&a[i]);//讀入需要排序的數組
        }
        
        qsort(a, N, sizeof(a[0]),compare);//對數組進行排序
        //!!!注意參數填寫完整
        for(i = 0; i <N ; i ++)
        {
            printf("%d ", a[i]);//輸出排序結束以後的數組
        }
        
        printf("\n");
        
        return 0;
    }
               
    快速排序:快速排序采用了一種分治政策——将原問題分解成若幹個規模更小但是結構跟原問題相似的子問題。這些子問題的解決則利用了遞歸思想

繼續閱讀