在此对于桶排序做出两种方法:
一.简化版桶排序
代码如下:
<span style="font-size:18px;">/*简化版的桶排序*/ #include <stdio.h> int main() { int book[1001],i,j,t,n; for(i=0;i<=1000;i++) { book[i]=0; } scanf("%d",&n);//输入一个数n,表示接下来有n个数 for(i=1;i<=n;i++)//循环读入n个数,并进行桶排序 { scanf("%d",&t); //把每一个数读到变量t中 book[t]++; //进行计数,对编号为t的桶放一个小旗子 } for(i=0;i<=1000;i++) //依次判断编号1000~0的桶 { for(j=1;j<=book[i];j++) //出现了几次就将桶的编号打印几次 { printf("%d ",i); } getchar(); } getchar(); return 0; }</span>
二.完整版桶排序
基数排序(有MSD和LSD)
现在先实现最简单的基数排序,就是对数字只有从小到大排序,没有类别之分。函数加测试代码如下:
/*完整版桶排序*/ #include <iostream> #include <list> using namespace std; #define RADIX 10 /** * 基树排序(有MSD和LSD) * 现在先实现最简单的基数排序,就是对数字只有从小到大排序,没有类别之分 * 基数排序的思想就是: * 先对个位数字进行排序,排序完成之后,统计成堆 * 接着对上面排好序的十位数字进行排序,排序完成之后,再进行对 * 排好序的百位数字排序,一次类推 */ void RadixSort(int arr[],int n) { for(int m = 0;m < RADIX;m++) //创建RADIX个链表 { //还是采用list作为桶 list<int> *lists = new list<int>[RADIX]; for(int i = 0;i < n;i++) { int temp = arr[i]; int loc = 1; for(int t = 1;t < m;t++) { loc *= 10; } lists[(temp/loc%10)].push_back(arr[i]);//数值相同的插入到等值链表中 } int j = 0; //合并RADIX个链表 for(i = 0;i < 10;i++) { if(lists[i].size() != 0) { list<int>::iterator it = lists[i].begin(); while(it != lists[i].end()) { arr[j] = *it; it++; j++; } } } } } void main() { int arr[] = {278,109,63,930,589,184,505,269,8,83}; for(int i = 0;i < sizeof(arr)/sizeof(int);++i) { cout<<arr[i]<<" "; } cout<<endl; RadixSort(arr,sizeof(arr)/sizeof(int)); for(i = 0;i < sizeof(arr)/sizeof(int);++i) { cout<<arr[i]<<" "; } cout<<endl; }
运行结果如下图:
十分期待大家对于我的批评和建议~谢谢大家
原文地址:http://blog.csdn.net/qaz3171210/article/details/46644437