服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - c语言实现基数排序解析及代码示例

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

2021-06-11 14:11GejinZ C/C++

这篇文章主要介绍了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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#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语言实现基数排序解析及代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/u013382399/article/details/68484578

延伸 · 阅读

精彩推荐