基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数
它是这样实现的:将所有待比较数值(正整数)统一为同样的数字长度,数字较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
#include<iostream>
using namespace std;
int RadixSortbefore(int arr[], int length)
{
int count=1;//最大位数初始化
int curbit = 10;
for (int i = 0;i < length;i++)
{
while (arr[i] >= curbit)
{
curbit *= 10;
count++;
}
}
return count;
}
void RadixSort(int arr[], int length)
{
int *count;
int *flag;
int radix = 1;
flag = new int[length];//收集器
count = new int[10]; //计数器
int maxbit = RadixSortbefore(arr, length);
for (int i = 0;i < maxbit;i++)
{
int key;
for (int j = 0; j < 10; j++)
{
count[j] = 0;
}
for (int j = 0; j <length; j++)
{
key = (arr[j] / radix) % 10;
count[key]++;
}
for (int j = 1; j < 10; j++)
{
count[j] += count[j - 1];
}
for (int j = length-1; j >=0; j--)
{
key = (arr[j] / radix) % 10;
flag[count[key] - 1] = arr[j];
count[key]--;
}
for (int j = 0; j < length; j++)
{
arr[j] = flag[j];
}
radix = radix * 10;
}
delete[]flag;
delete[]count;
}
int main()
{
int arr[] = { -1111,3,3,5,6,0,54,34,357 };
int length = (int)sizeof(arr) / sizeof(*arr);
radixsort(arr, length);
for (int i = 1; i <length; i++)
{
cout << arr[i] << " ";
}
return 0;
}
这里是另外一种方法(老师介绍的,有点复杂)
这里还用到了表排序不懂得可以看看我之前的代码
这里的主要思想与表排序类似,通过一个T数组来链接表,再通过表排序的方法实现改变数组,从而实现排序的目的。
struct Q //桶的结构体
{
int h;//头指针
int r;//尾指针
};
int getmaxbit(int arr[],int length)
{
int key=10;
int ans=1;
for(int i=0;i<length;i++)
{
if(arr[i]>=key)
{
key=key*10;
ans++;
}
}
return ans;
}
int get(int num, int i)//取第i位数
{
int ans;
while (i)
{
ans = num % 10;
num = num / 10;
i--;
}
return ans;
}
void radixsort(int arr[], int length)
{
Q *Ts = new Q[length];
int *T;
int k=-1;
int j;
int r;
int hh;
T = new int[length];//指针数组
for (int i = 0;i < length-1;i++)
{
T[i] = i + 1;
}
T[length - 1] = 0;
int maxbit=getmaxbit( arr, length);
for (int i = 1;i <=maxbit;i++)
{
int h = T[0];
for (int i = 0;i < 10;i++)//初始化
{
Ts[i].h = Ts[i].r = -1;
}
while (h!= 0)
{
k = get(arr[h], i);
hh = T[h];
if (Ts[k].h == -1)
{
Ts[k].h = Ts[k].r = h;
T[h] = 0;
}
else
{
T[Ts[k].r] = h;
Ts[k].r = h;
T[h] = 0;
}
h = hh;//移动
}
//将不同的桶之间链接起来
for ( j = 0;(j < 10) && (Ts[j].h == -1);j++);
T[0] = Ts[j].h;
r = Ts[j].r;
for (j = j + 1;j < 10;j++)
{
if (Ts[j].h != -1)//桶不为空就链接起来
{
T[r] = Ts[j].h;
r = Ts[j].r;
}
}
T[r] = 0;//结束
}
for (int i = 0;i < length;i++)
{
cout << T[i] << endl;
}
//这里是表排序
int i = 1;
int j1 = T[0];
while (i < length - 1)
{
if (i == j1) { i++;j1 = T[j1]; }
if (i < j1)
{
int P = T[j1];
int temp = arr[j1];
arr[j1] = arr[i];
arr[i] = temp;
T[j1] = T[i];
T[i] = j1;
i++;
j1 = P;
}
if (i > j1)
{
while (i > j1)
j1 = T[j1];
}
}
}