基数排序
2017-08-28 21:27:21、
writer:pprp
基数排序,基于每一位进行的桶排序
实现起来很难,也很巧妙
代码及讲解如下:
/*
@theme: 基数排序
@writer:pprp
@start: 21:00
@end: 21:25
@declare:优化加强版的桶排序
@date:2017/8/28
*/
#include <bits/stdc++.h>
#define maxn 10 //整形排序
#define maxSize 10 //关键字个数,这里为整形位数
#define N 100
using namespace std;
int NumInPos(int num,int pos)
{
int temp = 1;
for (int i = 0; i < pos - 1; i++)
temp *= 10;
return (num / temp) % 10;
}
//data需要排序的数组,Size是数组个数
void RadixSort(int* data, int Size)
{
int *Radix[maxn]; //分别为0~9的序列空间
for (int i = 0; i < 10; i++)
{
Radix[i] = (int *)malloc(sizeof(int) * (Size + 1));
Radix[i][0] = 0; //index为0处记录这组数据的个数
}
//枚举当按照哪一位进行桶排序
for (int pos = 1; pos <= maxSize; pos++) //从个位开始到31位
{
//将所有的元素按照第POS位进行排序
for (int i = 0; i < Size; i++) //分配过程
{
int num = NumInPos(data[i], pos); //第pos位的值为num
int index = ++Radix[num][0]; //相当于一个计数器
Radix[num][index] = data[i]; //将该位置的记录中记载下来该元素的值
}
//双指针 i是用来指向radix数组,进行遍历
// k是用来遍历i指向部分的元素
// j是用来指向数组data的指针,进行++
for (int i = 0, j =0; i < maxn; i++) //收集0- 9
{
for (int k = 1; k <= Radix[i][0]; k++)
data[j++] = Radix[i][k];
Radix[i][0] = 0; //复位
}
}
}
int main()
{
int a[N];
for(int i = 0 ;i < 15 ; i ++)
{
// srand((int)time(NULL)+i);
a[i] = rand()%1000;
cout << a[i] <<" ";
}
cout << endl;
RadixSort(a,15);
for(int i= 0 ; i < 15; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
代码改变世界