7.计数排序

 

#include <iostream>
using namespace std;

bool Counting_sort(int *a, int *b, int k, int n)
{
    int *c = new int[k];
    for(int i = 0; i <= k; i++)
        c[i] = 0; 
    
    for(int i = 0; i < n; i++)
        c[a[i]]++;
    for(int i = 1; i <= k; i++)
        c[i] += c[i - 1];
    
    for(int i = n - 1; i >= 0; i--)
        b[c[a[i]]-- - 1] = a[i];
    return true;
}

int main()
{
    int n;    
    cin >> n;
    int *num = new int[n], *ans = new int[n];
    int *k = &num[0];
    for(int i = 0; i < n; i++)
    {
        cin >> num[i];
        if(*k <= num[i]) k = &num[i];
    }
    
    Counting_sort(num, ans, *k, n);
    
    for(int i = 0; i < n; i++)
        cout << ans[i] << " ";
    cout << endl;
} 

时间复杂度:O(2(n + k)) == O(n);

没多大用处的排序算法,

  a.只能对正数排序.

  b.主要对批量小数据有用, 极易因k值过大导致MLE

  c.个人能力原因,此排序算法的代码并不能优雅的写出来.

  d.内存浪费严重, 好在时间复杂度不高(目前最低!?), 没多大实用价值。

对一些地方的解释:

  a[i] 待排序的第i个数

  b[i] 存储排序后序列

  c[i] 值为i的数的个数 -> 值不大于i的数的个数

 ps.可能是因为今晚状态不好, 计数排序的代码写的好烂, 有时间会重写的

posted @ 2016-09-08 10:44  筱陌  阅读(107)  评论(0编辑  收藏  举报