计数排序

来源:互联网 发布:php 访问sqlserver 编辑:程序博客网 时间:2024/06/01 17:59

计数排序思想

经典的排序算法都是基于元素之间的比较来确定元素的最终排序位置的,导致经典排序算法的时间复杂度的下界是nlogn ,经典的排序算法都可以归类未“比较排序”。
计数排序是非比较排序,它的思想是:对于1个待排序元素x,先计算出有多少个数小于等于x, 然后就可以直接确定x的最终正确位置。

复杂度

  • 时间复杂度:
    计数排序的时间复杂度是O(n+k), 所以当k < n的时候或者n与k在同一个数量级的时候,计数排序的时间复杂度是线性的O(n)
  • 空间复杂度:
    计数排序空间复杂度是O(n+k), 当k < n或者n与k在同一个数量级的时候,计数排序的空间复杂度是线性的O(n)

计数排序是稳定的

代码如下

//k是待排序数组中的最大值void count_sort(vector<int> arr, int k){    vector<int> B(arr.size());    vector<int> C(k+1, 0);    for(int i=0; i<arr.size(); i++)        C[arr[i]] += 1;    for(int j=1; j<=k; j++)        C[j] += C[j-1];    //之所以要从后向前扫描,是因为这样可以保持排序稳定性    for(int i=arr.size()-1; i>=0; i--){      B[C[arr[i]]-1] = arr[i];      C[arr[i]]--;    }    print(B, B.size());}
0 0
原创粉丝点击