比較排序:在排序的最終結果中,各元素的次序依賴於他們之間的比較。
計數排序基本思想:輸入一個數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]。
