寫在前面
背景
小哼的班上只有5個同學,這5個同學分別考了5分、3分、5分、2分、8分(最高分10分),接下來將分數按照從大到小排序,排序后的結果是:8 5 5 3 2 ,寫一段程序,讓計算機讀入5個數然后將這5個數從大到小輸出。
直接上代碼
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a[11];
//設置a[t]的默認值為0
for (int i=0; i<11; i++) {
a[i] = 0;
}
int t;
for (int i=0; i<5; i++) {
scanf("%d", &t);
a[t]++; //設置考t分的人數
}
for (int i=10; i>=0; i--) {
for (int j=0; j<a[i]; j++) {
printf("%d", i);
}
}
printf("\n");
return 0;
}
解讀
最高分是10分,所以創建了11個元素的數組,其中a[t]=n; 表示考t分的有n人。
默認情況下a[t]=0;
根據輸入的t值,使a[t]自增1;
然后通過對a[]的倒序遍歷,如果a[t]為0,則不輸出; 如果a[t]=n>0,則輸入n次t;
變形
輸入n個0~1000之間的整數,將它們從大到小排序。
#include <stdio.h>
int main(int argc, const char * argv[]) {
// insert code here...
int n;
scanf("%d", &n); //n表示要排序的數字個數
int a[1001];
//(1)
for (int i=0; i<1001; i++) {
a[i] = 0;
}
int t;
//(2)
for (int i=0; i<n; i++) {
scanf("%d", &t);
a[t] ++;
}
//(3)
for (int i=1000; i>=0; i--) {
for (int j=0; j<a[i]; j++) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
時間復雜度
代碼中標記(1)處,一共循環了M次,M為桶的個數。標記(2)處一共循環了N次,N為待排序數的個數,標記(3)處共循環了(M+N)次,所以總的時間復雜度是O(M+N+M+N)=O(2*(M+N)),忽略常數,最終桶排序的時間復雜度是O(M+N).
總結與反思
這是一個非常快的排序算法,但它不是真正的桶排序算法,真正的桶排序算法之后會講。這篇講的是簡化版的桶排序算法,其本質還不能算是一個真正意義上的排序算法。看一個例子: 5個人的名字和分數:huhu 5分,哈哈 3分, xixi 5分,hengheng 5分, river 8分。請按照分數從高到低,輸入他們的名字,如果用上面的簡化版桶排序算法僅僅是把分數進行了排序,最終輸入的僅僅是分數,但沒有對名字進行排序。
期待下一節:冒泡排序。