首页 > 代码库 > 线性排序:计数排序与基数排序

线性排序:计数排序与基数排序

前面讨论了几种排序算法,三种O(n2)时间复杂度的排序算法:插入,选择和冒泡和两种O(nlgn)的算法:快速排序和归并排序。这几种排序数组除了归并排序需要额外的数组开销。其他几个的空间复杂度都是O(1)。通过比较交换元素完成排序.

计数排序是利用空间换取时间,增加了两个额外数组的开销,而且计数排序有一定限制:即待排数组元素的大小在0-P之间。如果P的值很大,那么额外数组的开销也会很大。

计数排序,顾名思义就是通过一个额外数组来记下待排序数组中元素出现的次数。

void countsort(int a[],int n,int p)
{
    int *c = new int[p+1];
    for(int i =0 ;i <= p;i++)
        c[i] = 0;
    for(int j = 0;j < n;j++)
    {
        c[a[j]] += 1;           //记录A中元素出现的次数
    }
    for(int j = 1;j<p+1;j++)
    {
        c[j] = c[j-1] + c[j]; //这步操作实现了A中最大元素的计数也是最大的,A中元素越大,计数越大
    }
    int *b = new int[n];
    for(int i = n-1;i>=0;i--)
    {
        b[c[a[i]]-1] = a[i]; 
        c[a[i]]--;
    }
    for(int i = 0;i<n;i++)
        a[i] = b[i];
}

 

基数排序(radix sort)是从应用于穿卡机发展而来的,而发明这个算法的人就是IBM的始祖。基数排序是对一个数组A,数组每个元素是有d位数字,在对整个数组进行排序的时候,通过对每一位进行排序的方法。具体来说就是从低位到高位依次进行基数排序。那么得到的数组A就是有序的数组。对于每个数有k种取值可能时,总时间为O(d(n+k))。用伪代码说明:

RADIX SORT(A,d)
  for i = 1 to d
     do use stable sort to sort