首页 > 技术文章 > 基数排序

1314cyd 2021-08-21 17:08 原文

        基数排序

  导入:在常见oi比赛中o(n log n ) 的复杂度的排序(快速排序,归并排序,堆排序)已经够各位看官使用但你是否思考过有没有更优的排序算法呢,想必你一定会说桶排序o(n)的时间复杂度确实让其他算法无法比拟可o(m)

的空间一旦m>10^7该算法就只能尴尬离场了,那么真的没有更优的算法可以胜任这项工作了吗,今天我们介绍一种极优的排序算法——基数排序。

  关于各种排序的比较可以去膜拜大佬的博客各种排序算法总结




 

   基数排序介绍基数排序是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。
   具体做法:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

  图解: 通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下

#include<iostream>
#define N 10000

using namespace std;

int get(int a[], int n)
{
    int i, max;
    max = a[0];
    for (i = 1; i < n; i++)
        if (a[i] > max)
            max = a[i];
    return max;
} 
void work(int a[], int n, int exp)
{
    int mid[n];
    int i,q[10] = {0};
    for (i = 0; i < n; i++)
        q[ (a[i]/exp)%10 ]++;
    for (i = 1; i < 10; i++)
        q[i] += q[i - 1];

    for (i = n - 1; i >= 0; i--)
    {
        mid[q[ (a[i]/exp)%10 ] - 1] = a[i];
        q[ (a[i]/exp)%10 ]--;
    }
 
    for (i = 0; i < n; i++)
        a[i] = mid[i];
} 
void sort(int a[], int n)
{
    int exp; int max = get(a, n); 
    for (exp = 1; max/exp > 0; exp *= 10)
        work(a, n, exp);
}

int main()
{
    int i;
    int a[N];
    int ilen = (sizeof(a)) / (sizeof(a[0]));
    cout << "before sort:";
    for (i=0; i<ilen; i++)
        cout << a[i] << " ";
    cout << endl;
    sort(a, ilen);   
    cout << "after  sort:";
    for (i=0; i<ilen; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

好像讲的不是很清楚,我也不太会啦

推荐阅读