/************************ 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; }
以上如有错误,请指出,大家共同学习进步。
转载请经博主同意