桶排序, 是最快最简单的排序。有多宽维度,就要申请多大的数组。比如100分的试卷,就要申请101个数组(试卷是0-100分),有人考了100分,就把array[100]加1,有人考了90,就把array[90]加1,有人考了70,就把array[70]+1,又有人考了90,就把array[90]加1,那么从高到底打印,如果是某个分数是0个人,就不打印,如果某个分数是1个人,就打印一次,如果某个分数是2个人,就打印两次,上面的例子就是100,90,90,90,70。
桶排序快是毋庸置疑的,但是,浪费了空间。比如打游戏,新手村里的小鸡攻击力是1,而最后一个副本的大BOSS的攻击力是999999999,那么就要对这个游戏的所有玩家和怪物的攻击力排序,就要申请一个1000000000长度的数组,就是array[1000000000]。假如每个字段的值都是1,1是整形,需要是4-8个字节(到底是4还是8取决于机器),那么这个数组就是1000000000/8/1024/1024=119MB。嗯哼?一个数组就要119M,你就是13年淘宝双11的160G内存的机器也拖不起吧。
桶排序的时间复杂度是O(M+N),是最快的排序,它也是最简单的排序。
C语言代码:
#include <stdio.h> int main(){ int i, j, num, score, rank[100]; for(i=0; i<101; i++){ rank[i] = 0; } //需要录入多少个数据 printf("How many?\n"); scanf("%d", &num); for(i=0; i<num; i++){ printf("Enter Score:\n"); scanf("%d", &score); //我们的试卷是0-100分的哦 if(score<0 || score > 100){ printf("Error"); return 1; } //进桶 rank[score]++; score = 0; } printf("Rank:\n"); //打印 for(i=0; i<101; i++){ for(j=0; j<rank[i]; j++){ printf("%d,", i); } } }
下一篇:
算法二:冒泡排序
友情提示:垃圾评论一律封号...