計數排序和桶排序

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

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

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

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

  思路:排序

  一、初始化輔助數組。get

  二、循環遍歷每個輸入元素,若是一個輸入元素爲i,則輔助數組中相應的C[i]的值加1。執行完畢以後。數組C中存儲的就是各個鍵值在輸入數組中出現的次數。io

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

  四、循環將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)上。

  桶排序基本思路:

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

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

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

  三、完成上述操做以後,將B數組中每一個元素維護的鏈表進行排序。

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

相關文章
相關標籤/搜索