首页 > 代码库 > 基数排序 - 如果天空不死

基数排序 - 如果天空不死

概要

本章介绍排序算法中的基数排序。内容包括:

1. 基数排序介绍

2. 基数排序图文说明

3. 基数排序实现

3.1 基数排序C实现

3.2 基数排序C++实现

3.3 基数排序Java实现

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3603669.html

更多排序和算法请参考:数据结构与算法系列 目录

基数排序介绍

基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。

具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基数排序图文说明

基数排序图文说明



通过基数排序对数组{53, 3, 542, 748, 14, 214, 154, 63, 616},它的示意图如下:

在上图中,首先将所有待比较树脂统一为统一位数长度,接着从最低位开始,依次进行排序。

1. 按照个位数进行排序。

2. 按照十位数进行排序。

3. 按照百位数进行排序。

排序后,数列就变成了一个有序序列。

基数排序代码

/*

* 获取数组a中最大值

*

* 参数说明:

* a -- 数组

* n -- 数组长度

*/

int get_max(int a[], int n)

{

int i, max;

max = a[0];

for (i = 1; i < n; i++)

if (a[i] > max)

max = a[i];

return max;

}

/*

* 对数组按照"某个位数"进行排序(桶排序)

*

* 参数说明:

* a -- 数组

* n -- 数组长度

* exp -- 指数。对数组a按照该指数进行排序。

*

* 例如,对于数组a={50, 3, 542, 745, 2014, 154, 63, 616};

* (01) 当exp=1表示按照"个位"对数组a进行排序

* (02) 当exp=10表示按照"十位"对数组a进行排序

* (03) 当exp=100表示按照"百位"对数组a进行排序

* ...

*/

void count_sort(int a[], int n, int exp)

{

int output[n]; // 存储"被排序数据"的临时数组

int i, buckets[10] = {0};

// 将数据出现的次数存储在buckets[]中

for (i = 0; i < n; i++)

buckets[ (a[i]/exp)%10 ]++;

// 更改buckets[i]。目的是让更改后的buckets[i]的值,是该数据在output[]中的位置。

for (i = 1; i < 10; i++)

buckets[i] += buckets[i - 1];

// 将数据存储到临时数组output[]中

for (i = n - 1; i >= 0; i--)

{

output[buckets[ (a[i]/exp)%10 ] - 1] = a[i];

buckets[ (a[i]/exp)%10 ]--;

}

// 将排序好的数据赋值给a[]

for (i = 0; i < n; i++)

a[i] = output[i];

}

/*

* 基数排序

*

* 参数说明:

* a -- 数组

* n -- 数组长度

*/

void radix_sort(int a[], int n)

{

int exp; // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...

int max = get_max(a, n); // 数组a中的最大值

// 从个位开始,对数组a按"指数"进行排序

for (exp = 1; max/exp > 0; exp *= 10)

count_sort(a, n, exp);

}

radix_sort(a, n)的作用是对数组a进行排序。

1. 首先通过get_max(a)获取数组a中的最大值。获取最大值的目的是计算出数组a的最大指数。

2. 获取到数组a中的最大指数之后,再从指数1开始,根据位数对数组a中的元素进行排序。排序的时候采用了桶排序。

3. count_sort(a, n, exp)的作用是对数组a按照指数exp进行排序。

下面简单介绍一下对数组{53, 3, 542, 748, 14, 214, 154, 63, 616}按个位数进行排序的流程。

(01) 个位的数值范围是[0,10)。因此,参见桶数组buckets[],将数组按照个位数值添加到桶中。

(02) 接着是根据桶数组buckets[]来进行排序。假设将排序后的数组存在output[]中;找出output[]和buckets[]之间的联系就可以对数据进行排序了。

基数排序实现

基数排序C实现

实现代码(radix_sort.c)

1/**

2 * 基数排序:C 语言

3 *

4 * @author skywang

5 * @date 2014/03/15

6*/

7

8 #include

9

10// 数组长度

11#define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )

12

13/*

14 * 获取数组a中最大值

15 *

16 * 参数说明:

17 * a -- 数组

18 * n -- 数组长度

19*/

20int get_max(int a[], int n)

21{

22int i, max;

23

24 max = a[0];

25for (i = 1; i < n; i++)

26if (a[i] > max)

27 max = a[i];

28return max;

29}

30

31/*

32 * 对数组按照"某个位数"进行排序(桶排序)

33 *

34 * 参数说明:

35 * a -- 数组

36 * n -- 数组长度

37 * exp -- 指数。对数组a按照该指数进行排序。

38 *

39 * 例如,对于数组a={50, 3, 542, 745, 2014, 154, 63, 616};

40 * (01) 当exp=1表示按照"个位"对数组a进行排序

41 * (02) 当exp=10表示按照"十位"对数组a进行排序

42 * (03) 当exp=100表示按照"百位"对数组a进行排序

43 * ...

44*/

45void count_sort(int a[], int n, int exp)

46{

47int output[n]; // 存储"被排序数据"的临时数组

48int i, buckets[10] = {0};

49

50// 将数据出现的次数存储在buckets[]中

51for (i = 0; i < n; i++)

52 buckets[ (a[i]/exp)%10 ]++;

53

54// 更改buckets[i]。目的是让更改后的buckets[i]的值,是该数据在output[]中的位置。

55for (i = 1; i < 10; i++)

56 buckets[i] += buckets[i - 1];

57

58// 将数据存储到临时数组output[]中

59for (i = n - 1; i >= 0; i--)

60 {

61 output[buckets[ (a[i]/exp)%10 ] - 1] = a[i];

62 buckets[ (a[i]/exp)%10 ]--;

63 }

64

65// 将排序好的数据赋值给a[]

66for (i = 0; i < n; i++)

67 a[i] = output[i];

68}

69

70/*

71 * 基数排序

72 *

73 * 参数说明:

74 * a -- 数组

75 * n -- 数组长度

76*/

77void radix_sort(int a[], int n)

78{

79int exp; // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...

80int max = get_max(a, n); // 数组a中的最大值

81

82// 从个位开始,对数组a按"指数"进行排序

83for (exp = 1; max/exp > 0; exp *= 10)

84 count_sort(a, n, exp);

85}

86

87void main()

88{

89int i;

90int a[] = {53, 3, 542, 748, 14, 214, 154, 63, 616};

91int ilen = LENGTH(a);

92

93 printf("before sort:");

94for (i=0; i= 0; i--)

58 {

59 output[buckets[ (a[i]/exp)%10 ] - 1] = a[i];

60 buckets[ (a[i]/exp)%10 ]--;

61 }

62

63// 将排序好的数据赋值给a[]

64for (i = 0; i < n; i++)

65 a[i] = output[i];

66}

67

68/*

69 * 基数排序

70 *

71 * 参数说明:

72 * a -- 数组

73 * n -- 数组长度

74*/

75void radixSort(int a[], int n)

76{

77int exp; // 指数。当对数组按各位进行排序时,exp=1;按十位进行排序时,exp=10;...

78int max = getMax(a, n); // 数组a中的最大值

79

80// 从个位开始,对数组a按"指数"进行排序

81for (exp = 1; max/exp > 0; exp *= 10)

82 countSort(a, n, exp);

83}

84

85int main()

86{

87int i;

88int a[] = {53, 3, 542, 748, 14, 214, 154, 63, 616};

89int ilen = (sizeof(a)) / (sizeof(a[0]));

90

91 cout