c语言实现基数排序解析及代码示例

作者:GejinZ 时间:2021-10-17 19:37:51 

1.

基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucketsort)或binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。

2.基数排序的实现方法分为两种:

最高位优先(MostSignificantDigitfirst)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。

最低位优先(LeastSignificantDigitfirst)法,简称 * 法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

3. * 基数排序的原理及代码实现如下:

第一步

假设原来有一串数值如下所示:

73,22,93,43,55,14,28,65,39,81

首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:

0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39

第二步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:

81,22,73,93,43,14,55,65,28,39

接着再进行一次分配,这次是根据十位数来分配:

0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93

第三步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:

14,22,28,39,43,55,65,73,81,93

这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int getDigitNum(int x){
 if(x == 0) return 1;
 int res = 0;
 while(x){
   res ++;
   x /= 10;
 }
 return res;
}
void RadixSort(int data[], int n){
 //find the Maximum and its digit number
 int Max = data[0];
 for(int i = 1; i < n; i++){
   if(Max < data[i]) Max = data[i];
 }
 int maxNum = getDigitNum(Max);
 //maxNum times radix sort
 int divisor = 1;
 for(int k = 0; k < maxNum; k++){
   vector<int> g[10];//g[i]中包含了"末位"数字是i的data[]数组中的元素
   for(int i = 0; i < 10; i++) g[i].clear();
   for(int i = 0; i < n; i++){
     int tmp = data[i] / divisor % 10;
     g[tmp].push_back(data[i]);
   }
   int cnt = 0;
   for(int i = 0; i < 10; i++){
     for(int j = 0; j < g[i].size(); j++){
       data[cnt++] = g[i][j];
     }
   }
   divisor *= 10;
 }
}
int main(){
 int Array[10] = {73,22,93,43,55,14,28,65,39,81};
 RadixSort(Array, 10);
 for(int i = 0; i < 10; i++){
   printf("%d ", Array[i]);
 }
 printf("\n");
 return 0;
}

来源:http://blog.csdn.net/u013382399/article/details/68484578

标签:基数排序,算法,c语言
0
投稿

猜你喜欢

  • Java编程实现月食简单代码分享

    2022-12-27 12:33:24
  • WPF调用ffmpeg实现屏幕录制

    2023-04-23 13:57:00
  • c#调用arcgis地图rest服务示例详解(arcgis地图输出)

    2023-03-05 14:56:05
  • Android Studio 3.5版本JNI生成SO文件详解

    2022-06-11 19:34:11
  • java导出Excel通用方法实例

    2023-10-27 04:43:33
  • C#实现集合转换成json格式数据的方法

    2022-03-18 03:28:50
  • C#实现字符串与图片的Base64编码转换操作示例

    2021-07-06 14:29:21
  • C#委托与匿名委托详解

    2023-02-24 21:12:41
  • java private关键字用法实例

    2022-01-16 10:08:06
  • 探究Java常量本质及三种常量池(小结)

    2023-06-17 10:28:17
  • spring boot 2整合swagger-ui过程解析

    2021-08-08 22:57:35
  • SpringBoot实现配置文件的替换

    2023-11-21 22:27:16
  • 详解java并发之重入锁-ReentrantLock

    2021-08-03 03:58:08
  • android虚拟键盘弹出遮挡登陆按钮问题的解决方法

    2022-03-06 15:54:54
  • Android Touch事件分发过程详解

    2021-08-28 20:11:33
  • 详解android 中animation-list 动画的应用

    2022-09-13 18:28:31
  • Java中使用内存映射实现大文件上传实例

    2022-01-16 05:02:16
  • Android 通过productFlavors实现多渠道打包方法示例

    2022-08-27 16:04:35
  • java中maven下载和安装步骤说明

    2022-03-05 23:07:59
  • Mybatis注解增删改查的实例代码

    2022-03-31 01:26:15
  • asp之家 软件编程 m.aspxhome.com