計數排序和桶排序


  比較排序:在排序的最終結果中,各元素的次序依賴於他們之間的比較。

  計數排序基本思想:輸入一個數X,確定小於X的元素的個數,這樣,就可以把這個數放在輸出數組的指定位置上。

  假設輸入數組是A[1...n],則需要一個輔助數組C[0...K],一個輸出數組B[1...n]。其中k代表輸入數組中的最大值,n代表輸入數組的長度。

  其中,輸入數組A是需要進行排序的一組數據,輸出數組B是需要排序完成后的數據。輔助數組中是按鍵值存儲該鍵值在輸入數組中出現的次數。

  思路:

  1、初始化輔助數組。

  2、循環遍歷每一個輸入元素,如果一個輸入元素為i,則輔助數組中相應的C[i]的值加1。執行完畢之后。數組C中存儲的就是各個鍵值在輸入數組中出現的次數。

  3、再通過加總計算確定對於從1到k,有多少個輸入元素是小於等於k的。將結果賦值到數組C中。

  4、循環將A[J]放到它在輸出數組的正確位置上。對於一個值來說,C[A[J]]的值就是它在輸出數組B中的正確位置。

      當輸入數組中的元素都是互異時,就比較好理解。但是當數組中有些元素相同時。

      我們每將一個值放入輸出數組中,都要將輔助數組中相應的值減1。這樣,當存在下一個相同的值時,該元素可直接放在輸出數組中相對應的位置上。

  總結:計數排序的時間復雜度為O(n),計數排序最重要的特性是穩定。

  缺點:計數排序非常浪費空間。例如需要排序數的范圍是0~2100000000之間,那你則需要申請2100000001個變量。

#include <stdio.h>
int main()
{
    int a[11],i,j,t;
    for(i=0;i<=10;i++)
        a[i]=0;  //初始化為0
                 
    for(i=1;i<=5;i++)  //循環讀入5個數
    {
        scanf("%d",&t);  //把每一個數讀到變量t中
        a[t]++;  //進行計數
    }
    for(i=0;i<=10;i++)  //依次判斷a[0]~a[10]
        for(j=1;j<=a[i];j++)  //出現了幾次就打印幾次
            printf("%d ",i);
    getchar();getchar();
    //這里的getchar();用來暫停程序,以便查看程序輸出的內容
    //也可以用system("pause");等來代替
    return 0;
}

  桶排序:桶排序實質上與計數排序差異不大。

  桶排序的時間復雜度為O(n)。計數排序是假設輸入的數據都屬於一個小區間內的整數,而桶排序則假設輸入是由一個隨機過程產生的。該過程將元素均勻、獨立的分布在區間[0,1)上。

  桶排序基本思路:

  1、輸入數組為A,輔助數組為B。初始化數組B,可將[0,1)按指定大小分為N個區間,即數組中有N個元素。稱為桶。

  2、循環遍歷輸入數組,將A數組中大小位於某一區間的數存放在指定的B數組元素維護的鏈表上。

      B數組上的元素維護一個鏈表。鏈表上的元素是位於區間大小的A數組元素。

  3、完成上述操作之后,將B數組中每個元素維護的鏈表進行排序。

  4、最后按照B數組中元素的順序輸出。B[0]—>B[1]—>....B[N-1]。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM