/************************
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;
}
经典算法之基数排序两种实现
最新推荐文章于 2024-08-19 23:54:49 发布