八种排序整理(七)----基数排序

基本概念:基数排序(Radix Sorting)是一种借助多关键字排序的思想对单逻辑关键字进行关系的方法。

基数排序不需要进行记录关键字间的比较。

 
主要分为两个过程:

(1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)。

(2)收集,再将放置在0~9号桶中的数据按顺序放到数组中 。

基数排序的特点:

稳  定  性:稳定
时间复杂度:O(kn)(k表示整形的最高位)
空间复杂度:O(10n)

#include <iostream>
#include <stdlib.h>  

void RadixCountSort(int *index, int *a, int len)    //收集 
{  
    int *count = (int *)malloc(sizeof(int) * 10);
    int i;

    for (i = 0; i < 10; i++)  
    {  
        count[i] = 0;  
    }

    for (i = 0; i < len; i++)
    {  
        count[index[i]]++;  
    }  
  
    for (i = 1; i < 10; ++i)
    {  
        count[i] += count[i - 1];  
    }  
  
    int *sort = (int *)malloc(sizeof(int) * len);
 
    for (i = len - 1; i >= 0; i--)  
    {  
        count[index[i]]--;          
        sort[count[index[i]]] = a[i];  
    }  
  
    for (i = 0; i < len; i++)
    {  
        a[i] = sort[i];  
    }
    
    free(sort);
    free(count); 
}  

void RadixSort(int *a, int len)             //分配  
{  
    int *radix = (int *)malloc(sizeof(int) * len);  
  
    int x = 1; 
    int tmp = 1;

    while (x)  
    {
        int i;
        x = 0;  
        tmp *= 10;  
   
        for (i = 0; i < len; i++)  
        {  
            radix[i] = a[i] % tmp;  
            radix[i] /= tmp / 10; 
            if (a[i] / tmp > 0)  
            {  
               x = 1;  
            }
        }

        RadixCountSort(radix, a, len);    
    }  
  
    free(radix);  
}  
 
int main()  
{
    int i;
    int a[] = {278, 109, 63, 930, 589, 184, 505, 269, 8, 83};  
    int len = sizeof (a) / sizeof (int);

    RadixSort(a, len);  
  
    for (i = 0; i < len; i++)  
    {  
        printf("%d ", a[i]);  
    }  
    printf("
");  
    while(1);
    return 0;  
}  
原文地址:https://www.cnblogs.com/kutoli/p/8337917.html