簡述計數排序
看了好多別人寫的計數排序。看了好久都沒看懂,弄了好久最後發現這麼簡單竟然花了幾個小時,所以在這裡寫上,希望和我一樣的剛開始學習的人不會再繞彎路
。一、簡述計數排序的思想:
設被排序的陣列為a,排序後儲存到b。c為暫時陣列。
所謂計數,首先是通過乙個陣列c[i]計算大小等於i的元素個數。此過程僅僅須要一次迴圈遍歷就能夠。在此基礎上。計算小於或者等於i的元素個數,也是一重迴圈就完畢。下一步是關鍵:逆序迴圈。從length[a]到1,將a[i]放到b中第c[a[i]]個位置上。原理是:c[a[i]]表示小於等於a[i]的元素個數,正好是a[i]排序後應該在的位置。並且從length[a]到1逆序迴圈,能夠保證同樣元素間的相對順序不變,這也是計數排序穩定性的體現。在陣列a有附件屬性的時候,穩定性是很重要的。
二、簡述:
其實。計數排序要浪費大量的記憶體空間,並且對於負數的序列在此討論的也是無法結決的問題並且排序的序列的書必須位於0-k之間,但其演算法複雜度小o(n+k)即是它的演算法複雜度,這個演算法是乙個穩定的演算法。
我們做排序有兩種情況。一種是沒有反覆出現的數的排序。還有一種則是有這樣的情況的。
以上扯的讓人看不懂,說普通點就是給你乙個陣列如a[10] = 這個陣列,我們建立乙個暫時陣列來儲存,也是這個演算法的操作經典所在,即我們建立乙個c[k]這種乙個陣列,這裡k 表示條件即要使用此演算法必須滿足的條件,那麼就是陣列a中的元素必須都在0-k之間。
我們通過陣列c下標來記錄我們須要排序的陣列a中的元素。然後僅僅要輸出記錄了這些的下標就好了。
假設針對沒有反覆的序列,我們非常easy能夠得到這種排好序的序列如:a[5]=
下標01
2345
6789
陣列c101
0101
101取下標排序後02
4679
然後我們將排序後的數放入乙個新的數b[5]=
得到:b[5] =這樣我們就得到了這個序列。
假設針對有反覆的情況:
我們僅僅須要記錄有幾個反覆的就好了。在上表中的第二行就是用來解決問題的,我們可用來記錄有幾次反覆。從而達到徹底的解決這排序的問題。
這部分**在此貼上:
int j=0,temp;
for(int i=0;i<=k;i++)
}
我們通過c這個陣列來記錄同樣。即反覆出現的數。
貼上所有**:
/***計數排序是一種非比較的穩定的高效的排序演算法
*@author 菜鳥
*@version 2014.7.13
*/#include #include #include using namespace std;
//計數演算法函式
/***@param int a 用來接收須要排序的序列
*@param int length_a 表示須要排序的序列的長度
*@param int b 用來儲存排序好後的序列
*@param int k 表示須要排列的數必須處於0-k之間
*@return 無
*/void countsort(int a,int length_a,int b,int k)
c = (int *)malloc(sizeof(int)*k);
if(c != null)
} free(c);
}/**
*輸出函式
*@param intarraynum 表示接受須要輸出的陣列
*@param int length_num 表示須要輸出的陣列的長度
*@return 無
*/void output(int arraynum,int length_num){
for(int i =0; i< length_num;i++){
cout<<"第"<
排序演算法之計數排序
今在學習中,遇到計數排序演算法,雖然其對待排序的序列要求嚴格,但對於符合條件的序列來說,其時間複雜度很小。故列於此,僅為學習記憶。參考資料 對於僅由大寫字母 或小寫字母 構成的無序序列,可採用下面演算法進行排序。該演算法不在序列的每個元素間進行比較,而是使用了乙個額外的help整型字串來記錄每個元素...
線性排序之 計數排序
counting sort適用於排列分布比較集中的資料,即最大值和最小值相差不會太大,具體這個差在多少合適,還是以後值得我思考的問題?計數排序的演算法思想是需要分配3個陣列,original,counter original counter i counter i counter i 1 即計數為小...
演算法 排序之計數排序
最近想到演算法導論中的計數排序,看看理解的怎麼樣試著講講自己的理解。1 思想 計數排序 是 線性時間的 排序演算法,時間複雜度為o n 雖然有一定的侷限性。但是還是很好的一種演算法。用2個陣列進行額外的儲存資訊,陣列 c 是對 資料中值相同的 記錄下來,以便後面查閱 b 是輸出的有序陣列,再將有序的...