經典演算法之基數排序兩種實現

wardseptember發表於2017-12-07
/************************
author's email:wardseptember@gmail.com
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;
}

以上如有錯誤,請指出,大家共同學習進步。



轉載請經博主同意

相關文章