[经典算法]基数排序
概述:
基数排序是一种高效的线性排序算法。其方法是将数据按位分开,并从数据的最低有效位到最高有效位进行比较,依次排序,从而得到有序数据集合。
例子:
用基数排序对十进制数据{15,12,49,16,36,40}进行排序。
在对个位数排序之后=> {40,12,15,16,36,49};
在对十位数排序之后=> {12,15,16,36,40,49};
有一点非常重要,在对每一位数值进行排序时其排序过程必须是稳定的。
程序代码:
#include <gtest/gtest.h> #include <algorithm> using namespace std; void RxSort(int* data, int size, int p, int k) { int* counts = new int[k]; int* sorted = new int[size]; for (int n=0; n<p; n++) { memset(counts, 0, sizeof(int)*k); int qval = (int)pow((double)k, (double)n); // 计数排序 for (int i=0; i<size; ++i) { counts[(int)(data[i]/qval) % k]++; } for (int i=1; i<k; ++i) { counts[i] += counts[i-1]; } for (int i=size-1; i >=0; --i) { int index = (int)(data[i]/qval) % k; counts[index]--; sorted[counts[index]] = data[i]; } memcpy(data, sorted, sizeof(int)*size); // 计数排序 End } delete[] counts; delete[] sorted; } // 辅助函数 template<typename T> static void ShowElem(T& val) { cout << val << " "; } template<typename T> static bool Validate(T* data, int len) { for (int i=0; i < len-1; ++i) { if (data[i] > data[i+1]) { return false; } } return true; } //测试代码 TEST(Algo, tCountSort) { int d1[] = {2,82,73,11,12,85,6,4}; RxSort(d1, 8, 2, 10); for_each(d1, d1+8, ShowElem<int>); ASSERT_TRUE(Validate(d1,8)); cout << endl; int d2[] = {2}; RxSort(d2, 1, 1, 10); for_each(d2, d2+1, ShowElem<int>); ASSERT_TRUE(Validate(d2,1)); cout << endl; int d3[] = {2,4,5,66,7,52,2,3,5,7,10,111,2,4,5,68,3,4,53}; RxSort(d3, 19, 3, 10); for_each(d3, d3+19, ShowElem<int>); ASSERT_TRUE(Validate(d3,19)); cout << endl; }
运行结果:
参考引用:
算法精解-C语言描述