之前分析过对于n个元素进行排序,通过比较的方法比较次数的下限时nlogn,要想实现线性的排序算法,需要获取输入数据的额外信息。
这里介绍基数排序,是一种简单的排序,时间复杂度为O(n),但是需要限定输入数据的范围:例如输入数据是0~K范围内的数据。
在进行排序时,通过辅助数组C[0~K]来记录“输入数组A[0~n]中每个元素A[i]应该在输出数组B[0~n]中的最终位置C[A[i]]“,最后直接将A[i]插入B的合适位置B[C[A[i]]],从而保证输出数组有序。
view plaincopy to clipboardprint?
1 #include <iostream>
2 using namespace std;
3 const int K = 100;
4
5 void count_sort(int *a,int *b,int n)
6 {
7 int c[K]={0};
8 int i =0;
9 for(i=0;i<n;i++)
10 c[a[i]]++;//c[i]包含等于i的元素个数
11
12 for(i=1;i<K;i++)
13 c[i]+=c[i-1];//此时,c[i]包含小于等于i的元素个数
14 int j = 0;
15 for(j = n-1;j>=0;j--)
16 {
17 b[c[a[j]]-1] = a[j];
18 c[a[j]]--;//为了相同的元素
19 }
20 }
21 int main()
22 {
23 int a[10] ={1,2,3,5,2,1,6,7,3,10};
24 int b[10];
25 count_sort(a,b,10);
26 int i =0;
27 for(i=0;i<10;i++)
28 cout<<b[i] << " ";
29 cout << endl;
30 }