經典演算法之基數排序兩種實現
/************************
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;
}
以上如有錯誤,請指出,大家共同學習進步。
轉載請經博主同意
相關文章
- Swift實現八種經典排序演算法Swift排序演算法
- 力扣演算法經典第一題——兩數之和(Java兩種方式實現)力扣演算法Java
- JavaScript實現經典排序演算法JavaScript排序演算法
- 經典排序演算法PHP實現排序演算法PHP
- 用 PHP 實現經典排序演算法PHP排序演算法
- 經典排序演算法及其 Java 實現排序演算法Java
- 幾種經典的排序演算法排序演算法
- 經典演算法之快速排序演算法排序
- 經典十大排序演算法(含升序降序,基數排序含負數排序)排序演算法
- js實現兩種實用的排序演算法——冒泡、快速排序JS排序演算法
- 經典演算法之折半插入排序演算法排序
- 經典排序演算法的 C語言 | Java 實現排序演算法C語言Java
- 十大經典排序演算法之氣泡排序排序演算法
- 白話經典演算法系列之一 氣泡排序的三種實現 【轉】演算法排序
- 機器學習10種經典演算法的Python實現機器學習演算法Python
- 經典排序之選擇排序(Java)排序Java
- AQS:JAVA經典之鎖實現演算法(一)AQSJava演算法
- 經典排序演算法 - 快速排序Quick sort排序演算法UI
- 五種C語言非數值計算的常用經典排序演算法C語言排序演算法
- 白話經典演算法系列之中的一個 氣泡排序的三種實現演算法排序
- 幾種常用的排序演算法之JavaScript實現排序演算法JavaScript
- [經典排序演算法][集錦]排序演算法
- 經典排序演算法回顧:排序演算法
- 排序演算法(七大經典排序演算法)排序演算法
- 經典演算法(19)教你兩分鐘學會【選擇排序】演算法排序
- Java實現十個經典排序演算法(帶動態效果圖)Java排序演算法
- Jerry 2017年的五一小長假:8種經典排序演算法的ABAP實現排序演算法
- 看動畫學演算法之:排序-基數排序動畫演算法排序
- 10大經典排序演算法動畫排序演算法動畫
- 十大經典排序演算法動畫解析和 Java 程式碼實現排序演算法動畫Java
- AQS:JAVA經典之鎖實現演算法(二)-ConditionAQSJava演算法
- 排序演算法之快速排序的實現排序演算法
- php實現4種排序演算法PHP排序演算法
- 夯實基礎:排序演算法之堆排序排序演算法
- 排序演算法__基數排序排序演算法
- 經典排序演算法 — C#版本(中)排序演算法C#
- 經典排序演算法 — C# 版(上)排序演算法C#
- 經典演算法之直接插入排序及其優化演算法排序優化