经典排序算法---基数排序

Posted INnoVation-V2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典排序算法---基数排序相关的知识,希望对你有一定的参考价值。

假设原来有一串数值如下所示:
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
 
代码:
//获取末尾数
int getmantissa(int num, int digits) {
	int temp = 1;
	for (int x = 0; x < digits - 1; ++x)
		temp *= 10;
	return (num / temp) % 10;
}

void radixsort(struct SQ_LIST *v) {
	int digit = 1;
	//获取位数
	int save[10][100001];
	for (int i = 0, p = 10; i < v->Length; ++i)
		while (v->elem[i].ID >= p) {
			p *= 10;
			++digit;
		}

	//初始化二位数组每行的首元
	for (int x = 0; x < 10; x++) {
		save[x][0] = 0;
	}

	//基数排序
	for (int i = 1; i <= digit; i++) {
		for (int x = 0; x < v->Length+1; ++x) {
			int mantissa = getmantissa(v->elem[x].ID, i);
			int index = ++save[mantissa][0];        //每行的首元存储每行数据量
			save[mantissa][index] = v->elem[x].ID;
		}

		//合并
		for (int i = 0, x = 0; i < 10; i++) {
			for (int j = 0; j < save[i][0]; ++j) 
				v->elem[x++].ID = save[i][j + 1];
			save[i][0] = 0;                      //重新初始化每行首单元                 
		}
	}
}

  

以上是关于经典排序算法---基数排序的主要内容,如果未能解决你的问题,请参考以下文章

九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)

十大经典排序之:基数排序 |计数排序

9经典算法基数排序

[新星计划] Python手撕代码 | 十大经典排序算法

[新星计划] Python手撕代码 | 十大经典排序算法

经典排序算法---基数排序