為面試做準備之計數排序
阿新 • • 發佈:2019-01-22
計數排序的優點是 1>.時間複雜度是O(n). 2>.穩定。缺點是空間複雜度是O(n)。
計數排序無需需要一個輔助陣列,和一個輸出陣列。
輔助陣列先存放輸入陣列中每個數字的個數,然後修改為相同陣列的最後一個的位置。
實現時需要注意兩點:1>.在輸入最大數字k時,分配輔助陣列需分配k+1個空間。2>. 由於最後在輔助陣列中存放的是以個數計算得到的值,所以寫入輸出陣列中時,需要減去1.
void countingSort(int A[], int B[], int k, int n) //A是輸入陣列,B是輸出陣列,k是A中最大的數字,n是A中數字個數 { //因為最大數字是k,所以我們建立的C要為k+1個 int *C = new int[k+1]; //對輔助陣列C[k]全部清0 for(int i = 0; i < k+1; ++i){ C[i] = 0; } //在C[k]中計數 for(int j = 0; j < n; ++j){ C[A[j]]++; } //計算每類數字的最後一個的位置 for(int i = 1; i < k+1; ++i){ C[i] += C[i-1]; } //對A重新排序寫入B中 for(int j = n-1; j >= 0; --j){ B[C[A[j]]-1] = A[j]; //從0開始,按數字個數計數時需要減去1. //A[j]這類數字的位置前移 C[A[j]]--; } }
計數排序本質是通過計算無序集合中整數出現的次數來決定集合應該如何排序的。
計數排序的時間複雜度為O(n+k),其中n為要排序的元素的個數,k為a[n]中最大的整數加1。
這是由於計數排序包含三個迴圈,其中兩個的執行時間正比於n,另一個的執行時間正比於k。
對於空間上來說,計數排序需要兩個大小為n的陣列,一個大小為k的陣列。