经典算法之基数排序两种实现

/************************
author's email:[email protected]
date:2017.12.7
基数排序两种实现方法
************************/#include <iostream>
#include<math.h>
#define maxSize 10
using namespace std;
void radixSort1(int *array, int digits);//基数排序
void radixSort2(int *a, int digits);//计数法基数排序
void printArray(int D[], int n);//输出数组
void main() {
	int D[maxSize] = { 12,805,484,46,116,378,257,588,465,4 };//构造一个一维数组
	int E[maxSize] = { 12,805,484,46,116,378,257,588,465,4 };//构造一个一维数组
	
	
	cout << "基数排序结果为:" << endl;
	radixSort1(D, 3);
	printArray(D, maxSize);
	cout << endl;


	cout << "计数法基数排序结果为:" << endl;
	radixSort2(E, 3);
	printArray(E, maxSize);
}
void radixSort1(int *a, int digits)//digits表示关键字最大位数,如465是三位
{
	int* tmpArray[maxSize];// 定义桶个数 0~9 共10个  
	int index, pos, element, eleNumber, tmp, log = 1;

	for (element = 0; element < maxSize; element++) {// 每个桶最大能装maxSize个关键字,预防所有关键字都是同一个数  
		tmpArray[element] = (int*)malloc((sizeof(int))*(maxSize + 1));
		tmpArray[element][0] = 0;// 初始化为0  
	}

	for (pos = 0; pos < digits; pos++) {// 从个位、十位、百位依次排序  

		for (element = 0; element < maxSize; element++) {// 把关键字放到桶里,分配动作  
			tmp = ++tmpArray[(a[element] / log) % 10][0];
			tmpArray[(a[element] / log) % 10][tmp] = a[element];
		}

		for (index = 0, element = 0; (element < maxSize) && (index < maxSize); element++) {
			for (eleNumber = 1; eleNumber <= tmpArray[element][0]; eleNumber++)
				a[index++] = tmpArray[element][eleNumber];
			tmpArray[element][0] = 0;
		}
		log = log * 10;
	}
}
void radixSort2(int *a, int digits) {//digits表示关键字最大位数,如465是三位数
	for (int k = 1; k <= digits; ++k) {
		int tmpArray[maxSize];//存放基数排序的结果

		/*十个桶,从0到9,分别存储个位或十位或百位上的数。如12,它个位上为2,放在桶2*/
		int countingArray[10] = { 0,0,0,0,0,0,0,0,0,0 };
		for (int i = 0; i < maxSize; ++i) {
			//k=1,取关键字个位上的数
			int temSplitDigit = a[i] / (int)pow(10, k - 1)- (a[i] / (int)pow(10, k)) * 10;
			countingArray[temSplitDigit] += 1;//统计每个桶所含的关键字的个数
		}

		// 统计大于各元素的个数 
		for (int m = 1; m < 10; m++)
		{
			countingArray[m] += countingArray[m - 1];
		}

		/*把排序结果赋值给temArray数组*/
		for (int n = maxSize - 1; n >= 0; n--)
		{
			int tmpSplitDigit = a[n] / (int)pow(10, k - 1) - (a[n] / (int)pow(10, k)) * 10;
			tmpArray[countingArray[tmpSplitDigit] - 1] = a[n];
			countingArray[tmpSplitDigit] -= 1;
		}

		for (int p = 0; p < maxSize; p++)
		{
			a[p] = tmpArray[p];//把排序结果赋值给a[]
		}
	}
}
void printArray(int D[], int n) {
	for (int i = 0; i < n; ++i)  //输出排序后的关键字
		cout << D[i] << " ";
	cout << endl;
}

以上如有错误,请指出,大家共同学习进步。



转载请经博主同意

猜你喜欢

转载自blog.csdn.net/wardseptember/article/details/78740020