基数排序

基数排序是把一个逻辑关键字看成是由多个关键字组合而成的,并且一步一步地按每个关键字排号顺序,如把这些关键字记为:K0,K1,…,Kr1,其中K0为该记录中最高有效关键字,而Kr1为最低有效关键字。如果从最高有效关键字开始排序成为MSD排序,如果从最低有效关键字开始排序成为LSD排序。
例如,一个整数由若干位组成,且各位都有次序的,从而使其最右边的数字为是最低有效位,而最左边的数字位是最高有效位,比如整数的范围为0<=K<=999,那么就可以使用LSD或MSD方法进行排序,此时有三个关键字(K0,K1,k2),其中k0是百位上的数字,k1为十位上的数字,而k2为个位上的数字,由于所有的关键字都属于0=<ki<=9范围,所以对每个关键字的排序都只需10个箱子。
假设输入序列为(179,208,306,93,859,984,55,9,271,33),则技术排序如下:

这里写图片描述
这里写图片描述
这里写图片描述
代码实现:

#include<stdio.h>
#define MAX_SIZE 100
#define MAX_DIGIT 3
#define RADX_SIZE 10
typedef struct list_node *list_pointer;
typedef struct list_node
{
   int key[MAX_DIGIT];
   list_pointer link;
};
//基数LSD排序
list_pointer radix_sort(list_pointer ptr)
{
   list_pointer front[RADX_SIZE],rear[RADX_SIZE];
   int i,j,digit;
   //从最低关键字进行排序
   for(i=MAX_DIGIT;i>=0;i--)
   {
      for(j=0;j<RADX_SIZE;j++)
         front[j]=rear[j]=NULL;
      while(ptr)
      {
         //获取值作为箱子的索引
         digit=ptr->key[i];
         //是否第一个元素
         if(!front[digit])
            front[digit]=ptr;
         else
            rear[digit]->link=ptr;
         rear[digit]=ptr;
         ptr=ptr->link;
      }
      ptr=NULL;
      //寻找第一个元素不为空的最小箱子索引,为下一个关键字排序做准备
      for(j=RADX_SIZE-1;j>=0;j--)
      {
         if(front[j])
         {
            rear[j]->link=ptr;ptr=front[j];
         }
      }
   }
   return ptr;
}

函数radix_sort对记录进行MAX_DIGIT遍扫描,每遍的处理时间为O(RADX_SIXE+n),所以,总的计算时间为O(MAX_DIGIT(RADIX_SIXE+n)).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值