【排序】1.1簡單桶排序
阿新 • • 發佈:2019-02-11
簡單的“桶排序”:書中介紹的桶排序是藉助一維陣列解決問題。將陣列下標作為已經排序的序列,將值存入陣列中對應的位置,達到排序的目的。
題目二:若對0-1000範圍內的整數進行排序呢?
題目一:5個同學分別考了5分、3分、5分、2分、8分,滿分為10分;讓計算機隨機讀入這5個數,按照分數從大到小輸出。
輸出結果:8 5 5 3 2
解:
思路:1.初始化大小為11的陣列a[0]-a[10];
2.分數對於陣列下標,存在則+1,代表出現的次數,比如,若5分,a[5]=1;
3.順序輸出,陣列中值表示輸出次數。
實現(C):
#include<stdio.h> int main() { int a[11],i,j,x; for(i=0;i<=10;i++) { a[i]=0; } for(i=0;i<5;i++) { scanf("%d",&x); a[x]++; } for(i=10;i>=0;i--) { for(j=1;j<=a[i];j++) { printf("%d",i); } } getchar();getchar(); return 0; }
解:
思路:如上題,需要大小為1001的陣列,1001個桶,來表示0-1000之間每個數出現的次數。
實現(C):
時間複雜度(如題二):#include<stdio.h> int main() { int a[1001],i,j,x,n; for(i=0;i<=1000;i++) { a[i]=0; } scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&x); a[x]++; } for(i=0;i<=1000;i++) { for(j=1;j<=a[i];j++) { printf("%d ",i); } } return 0; }
第一個迴圈執行m次(m為桶的個數),第二個迴圈執行n次(n為待排序數的個數),第三、四個迴圈共執行m+n次,共2*(m+n)次;
表示為O(2*(m+n)),忽略掉較小的常數,時間複雜度表示為O(M+N)。
總結:簡化版的桶排序,速度非常快,但有侷限性。