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

 更新时间:2017年12月18日 11:20:03   作者:GejinZ  
这篇文章主要介绍了c语言实现基数排序解析及代码示例,具有一定借鉴价值,需要的朋友可以参考下。

1.

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

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

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

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

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

第一步

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

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; 
} 

总结

以上就是本文关于c语言实现基数排序解析及代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • C语言sqrt函数的实例用法讲解

    C语言sqrt函数的实例用法讲解

    在本篇文章里小编给大家整理的是关于C语言sqrt函数的实例内容以及用法详解,需要的朋友们可以参考下。
    2020-02-02
  • C++的智能指针你真的了解吗

    C++的智能指针你真的了解吗

    这篇文章主要为大家详细介绍了C++的智能指针,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++实现井字棋游戏

    C++实现井字棋游戏

    这篇文章主要为大家详细介绍了C++实现井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • C++ Boost Optional示例超详细讲解

    C++ Boost Optional示例超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C语言例题之输出1000以内的所有完数

    C语言例题之输出1000以内的所有完数

    完数是一些特殊的自然数,它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身,如果一个数恰好等于它的因子之和,则称该数为“完数”,这篇文章主要给大家介绍了关于C语言例题之输出1000以内的所有完数的相关资料,需要的朋友可以参考下
    2022-11-11
  • C语言详尽图解函数栈帧的创建和销毁实现

    C语言详尽图解函数栈帧的创建和销毁实现

    我们知道c语言中函数都是被调用的,main函数里面能调用其他函数,其实main函数也是被别的函数调用的,下面通过本文给大家分享c语言函数栈帧的创建和销毁过程,一起看看吧
    2022-05-05
  • C语言实现线性表的基本操作详解

    C语言实现线性表的基本操作详解

    线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列,这篇文章带你学习如何通过C语言实现线性表的顺序存储和链式存储
    2021-11-11
  • VC中Tab control控件的用法详细解析

    VC中Tab control控件的用法详细解析

    以下是对VC中Tab control控件的用法进行了详细的介绍,需要的朋友可以过来参考下哦
    2013-09-09
  • C语言实现二叉树的示例详解

    C语言实现二叉树的示例详解

    这篇文章主要为大家详细介绍了C语言中二叉树的算法实现以及二叉树的遍历算法与应用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-06-06
  • C语言二维数组运用实现扫雷游戏

    C语言二维数组运用实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言二维数组运用实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06

最新评论