第八章線形時間排序之“計數法排序COUNTING-SORT”

來源:互聯網
上載者:User

這個方法很牛逼,這個排序方法不再像前面那些排序方法一樣根據比較來進行。

時間複雜度為O(k+n+k+n+n)=O(n),當k=O(n)時,可以保證時間複雜度為O(n),就可以用計數法來進行排序了。

這個方法的一個前提是必須要知道要排序的數組中元素的取值範圍。

#include <string.h>#include <time.h>#define BUFFER_SIZE 10void CountingSort(int *a,int len,int k){//a[]中的數在0~k之間 int i=0;int c[k+1];int b[len+1];int tmp=0;for(i=0;i<=k;i++){//計數清零,複雜度O(k)c[i]=0;}for(i=1;i<=len;i++){//開始計數,複雜度O(n)c[a[i]]++;}for(i=1;i<=k;i++){//複雜度O(k)c[i]+=c[i-1];//c[i]中裝的是小於等於i的數的個數 } for(i=len;i>0;i--){//按著計數來排序,複雜度O(n)。之所以從len到著來排序,是為了保持穩定性。tmp=a[i];b[c[tmp]]=tmp;c[tmp]--;}for(i=1;i<=len;i++){//把數組再複製回a中a[i]=b[i];}}int main(){int i=0;int a[BUFFER_SIZE+1]; //隨機產生數組 srand((unsigned)time(NULL));for(i=1;i<=BUFFER_SIZE;i++){a[i]=rand()%(BUFFER_SIZE+1);} printf("隨機產生的數組:\n");for(i=1;i<=BUFFER_SIZE;i++){printf("%d   ",a[i]);} printf("\n");CountingSort(a,BUFFER_SIZE,BUFFER_SIZE);printf("對數組進行計數排序:\n"); for(i=1;i<=BUFFER_SIZE;i++){printf("%d   ",a[i]);}system("pause");return 0;} 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.