基数排序
基数排序算法思想就类似哈希桶,把原数组的元素根据个位、十位、百位等…,看每一位是否相同,相同位的数据分别存放在大小为10的countt数组中,例如第一次计算个位,那就把计算出来的个位是多少,就把他存放在几号下标所对应的元素中,接着,再根据count数组中的值,计算每个数据起始应该存放的位置,最后再把元素组中的元素存放在tmp数组中。此时tmp数组中的数据就是根据其中某一位所排好的数据。接着循环,直到所有的位数都排列完。
时间复杂度:O(n+O(n) * 最大的位数),化简完就是O(n * m(最大的位数)),最好和最坏情况下都是O(m*n)
空间复杂度:O(n)
稳定性:稳定,非比较排序,不能有负数
适应场景:数据的位数不是很大的情况
思想:
1.先开辟好空间,来保存中间排好序的数据
2.统计每个个位相同的数据出现的次数,保存在count数组
3.计算每个数据要存入tmp数组的开始位置
4.将数据存放在tmp数组中
5.将排好序的数据写进原数组中
源码:
#include<iostream>
#include<assert.h>
using namespace std;
//基数排序
int GetCount(int* a, int n) //统计最多的位数
{
int num = 0;
int i = 0;
int count = 0;
int max = 0;
while (i < n)
{
count = 0;
num = a[i];
while (num)
{
num=num / 10;
count++;
}
if (max < count)
max = count;
i++;
}
return max;
}
void RadixSort(int* a, int n)
{
assert(a);
//1.先开辟好空间,来保存中间排好序的数据
int* tmp = new int[n];
int Count = GetCount(a, n);//位数
int base = 1;//用来循环计算每个数据的每一位
while (Count)
{
//2.统计每个个位相同的数据出现的次数,保存在count数组
int count[10] = { 0 };
int index = 0;//count的下标
for (int i = 0; i < n; i++)
{
index = (a[i] / base) % 10;
count[index]++;
}
//3.计算每个数据要存入tmp数组的开始位置
int start[10] = { 0 };
for (int i = 1; i < 10; i++)
{
start[i] = start[i - 1] + count[i- 1];
}
//4.将数据存放在tmp数组中
int num = 0;
for (int i = 0; i < n; i++)
{
num = (a[i] / base) % 10;
tmp[start[num]] = a[i];//将有序的数据存入tmp数组中
start[num]++;//每次存一个元素,就要把当前对应的起始位置后移一位
}
//5.将排好序的数据写进原数组中
for (int i = 0; i < n; i++)
{
a[i] = tmp[i];
}
base *= 10;
Count--;
}
delete[]tmp;
return;
}
int main()
{
int num[] = {22,31,85,64,52,100,43,65,93,57};
int size = sizeof(num) / sizeof(num[0]);
RadixSort(num, size);
for (int i = 0; i < size; i++)
{
cout << num[i] << " ";
}
system("pause");
return 0;
}