10.基数排序(Radix Sort)
基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;
(1)算法简介
基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。
(2)算法描述和实现;具体算法描述如下:
<1>.取得数组中的最大数,并取得位数;
<2>.arr为原始数组,从最低位开始取每个位组成radix数组;
<3>.对radix进行计数排序(利用计数排序适用于小范围数的特点);
(3)算法分析:最佳情况:T(n) = O(n * k);最差情况:T(n) = O(n * k);平均情况:T(n) = O(n * k)
#include <iostream>
using namespace std;
void printArray(int array[],int length)
{ for (int i = 0; i < length; ++i)
{ cout << array[i] << " "; }
cout << endl; }
/**求数据的最大位数,决定排序次数*/
int maxbit(int data[], int n)
{ int d = 1; //保存最大的位数
int p = 10;
for(int i = 0; i < n; ++i)
{ while(data[i] >= p) { p *= 10; ++d; } }
return d;
}
void radixsort(int data[], int n) //基数排序
{ int d = maxbit(data, n);
int tmp[n];
int count[10]; //计数器
int i, j, k;
int radix = 1;
for(i = 1; i <= d; i++) //进行d次排序
{ for(j = 0; j < 10; j++) count[j] = 0; //每次分配前清空计数器
for(j = 0; j < n; j++)//统计每个桶中的记录数
{ k = (data[j] / radix) % 10; count[k]++; }
for(j = 1; j < 10; j++) count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶
for(j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中
{ k = (data[j] / radix) % 10; tmp[count[k] - 1] = data[j]; count[k]--; }
for(j = 0; j < n; j++) data[j] = tmp[j]; //将临时数组的内容复制到data中
radix = radix * 10;
}
}
int main()
{ int array[10] = {73,22,93,43,55,14,28,65,39,81};
radixsort(array,10);
printArray(array,10);
return 0;
}