排序算法-高级篇(计数排序)

排序算法-高级篇(计数排序)

在前一篇的文章中我提到了非比较排序算法(基数排序),现在我要回顾的是另一种非比较排序算法(计数排序),计数排序的原理很 简单就是先统计序列中每个不同的元素出现的次数,然后再统计每个元素在排序后在序列中的位置,然后按照这个位置输出各个元素即可。

代码实现如下:

/* FileName: countingSort.cpp Author: ACb0y Create Time: 2011年2月14日21:12:31 Last modify Time: 2011年2月15日0:54:36 */ #include <iostream> using namespace std; /* 函数名: template<class type> void print(type * data, int n, char * format); 功能: 输出元素序列中的所有元素 参数: data (in): type *: 元素序列中头指针 n (in): int: 元素个数 format (in): char *: 元素输出格式 返回值: 无 */ template <class type> void print(type * data, int n, char * format) { for (int i = 0; i < n; ++i) { printf(format, data[i]); } printf("/n"); } /* 函数名: template <class type> void countingSort(type * data, int n, bool cmp(const type & lv, const type & rv), char * format); 功能: 计数排序 参数: data (in): type *: 元素序列头指针 n (in): 元素的个数 cmp (in): bool (const type &, const type &): 元素比较的函数谓词 format (in): char *: 元素输出格式 返回值: 无 */ template <class type> void countingSort(type * data, int n, bool cmp(const type & lv, const type & rv), char * format) { type min = data[0]; type max = data[0]; for (int i = 1; i < n; ++i) { if (cmp(data[i], min)) { min = data[i]; } if (!cmp(data[i], max)) { max = data[i]; } } max -= min; int * cnt = new int[max + 1]; int * d = new int[n]; for (int i = 0; i <= max; ++i) { cnt[i] = 0; } //统计待排序序列中每个数出现的次数 for (int i = 0; i < n; ++i) { ++cnt[data[i] - min]; } /* 统计"自己"在排序完后序列中的位置 */ for (int i = 1; i <= max; ++i) { cnt[i] += cnt[i - 1]; } /* 各个数据分配到自己的位置上 */ for (int i = 0; i < n; ++i) { d[cnt[data[i] - min] - 1] = data[i]; } print(d, 10, format); delete [] d; delete [] cnt; } /* 函数名: bool cmp_int(const int & lv, const int & rv); 功能: 比较两个整型元素的函数谓词 参数: lv (in): const int &: 左值 rv (in): const int &: 右值 返回值: true: lv < rv false: lv >= rv */ bool cmp_int(const int & lv, const int & rv) { if (lv < rv) { return true; } return false; } int main() { int data[10] = {-5, 23, 34, 5, 65, 234, 6, 734, 988, 29}; countingSort(data, 10, cmp_int, "%d "); return 0; }  

运行结果如下:

 

你可能感兴趣的:(排序算法-高级篇(计数排序))