计数排序(线性复杂度的排序,且不需要进行大小比较)
2012-10-21 22:59
302 查看
计数排序思想很美妙,不需要进行元素间大小的比较,时间复杂度是线性的,在实践中,经常采用计数排序,该排序稳定。计数排序要求元素大小限定在一定范围内,比如[0, k], 算法代码如下:
#include<iostream> using namespace std; // 0 <= a[i] <= k (其中i = 0, 1, 2,..., n-1) void countSort(int a[], int n, int k) { int *c = new int[k + 1]; //用于计数 int *b = new int ; //用于保存最终结果 int i; for(i = 0; i <= k; i++) //勿忘置0 c[i] = 0; for(i = 0; i < n; i++) //单独计数 c[a[i]]++; for(i = 1; i <= k; i++) //累加计数 c[i] += c[i - 1]; for(i = 0; i < n; i++) //a[i]归位 b[--c[a[i]]] = a[i]; //--是必要的 for(i = 0; i < n; i++) //保存结果 a[i] = b[i]; delete [] b; delete [] c; } int main() { int a[] = {0, 1, 5, 3, 2, 2, 3, 0, 2, 6}; int n = 10; int k = 6; countSort(a, n, k); int i; for(i = 0; i < n; i++) cout << a[i] << " "; cout << endl; return 0; }
相关文章推荐
- 比较多个日期大小,并对这些日期进行排序
- 对三维数组进行排序,x相等时比较y的大小,y相等时比较z的大小,用到qsort函数。
- 线性排序复杂度比较
- 计数排序——O(n)复杂度基于非比较的排序方法
- 基数排序--基于计数排序的线性时间复杂度的排序算法
- 计数排序和简单桶排序(非比较排序,时间复杂度为O(n))
- mysql 用case when 解决比较时间大小后在排序的问题
- Treeset根据值进行大小的排序
- 不进行比较如何确定两个数的大小
- java通过Comparable接口实现字符串比较大小排序的简单实例
- php比较多维数组中值的大小排序实现代码
- 计数排序 --非比较排序
- TreeSet要求加入的所有元素都可以相互比较大小;可以控制比较位置来决定排序方向;hashset只能比较可相等不能比较大小
- 【编程练习】空间复杂度为O(1)的线性排序原理及编程(GNU C实现)
- 排序算法(五):计数排序与非比较排序
- 线性排序算法-- 计数排序,基数排序,桶排序
- 对n个数字进行排序,其中两两不同的数字的个数为k,n远远大于k,而n的取值区间长度超过了内存的大小,时间复杂度最小
- 随机产生20个正整数存入数组a中,且每个数均在1000-9999之间(包含1000和9999)。对数组进行排序,要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前10个数放入数组b中,如果
- 用python对指定目录下的所有文件(夹)大小进行排序
- 数组排序数字大小,与筛选最大值最小值。冒泡比较法。。研究了好久才写出来与大家分享