【排序】基数排序(计数排序、桶排序)
在此对于桶排序做出两种方法:
一.简化版桶排序
代码例如以下:
<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;
}
执行结果例如以下图:
十分期待大家对于我的批评和建议~谢谢大家
浙公网安备 33010602011771号