ACM教程 - 计数排序

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACM教程 - 计数排序相关的知识,希望对你有一定的参考价值。

定义

计数排序(Count Sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。

计数排序的思想是在给定的一组序列中,先找出该序列中的最大值和最小值,从而确定需要开辟多大的辅助空间,每一个数在对应的辅助空间中都有唯一的下标。

  1. 找出序列中最大值和最小值,开辟 Max-Min+1 的辅助空间
  2. 最小的数对应下标为 0 的位置,遇到一个数就给对应下标处的值 +1
  3. 遍历一遍辅助空间,就可以得到有序的一组序列

  • 稳定性:根据 相等元素 在数组中的 相对顺序 是否被改变,排序算法可分为「稳定排序」和「非稳定排序」两类。
  • 就地性:根据排序过程中 是否使用额外内存(辅助数组),排序算法可分为「原地排序」和「异地排序」两类。一般地,由于不使用外部内存,原地排序相比非原地排序的执行效率更高。
  • 自适应性:根据算法 时间复杂度 是否 受待排序数组的元素分布影响 ,排序算法可分为「自适应排序」和「非自适应排序」两类。「自适应排序」的时间复杂度受元素分布影响,反之不受其影响。
  • 比较类:比较类排序基于元素之间的 比较算子(小于、相等、大于)来决定元素的相对顺序;相对的,非比较排序则不基于比较算子实现。

图解

性质

  • 时间复杂度
    • 最佳 O(n+k)
    • 平均 O(n+k)
    • 最差 O(n+k)
  • 空间复杂度
    • 最差 O(n+k)
  • 稳定性:稳定
  • 就地性:非原地
  • 自适应性:非自适应
  • 比较类:非比较 

C++

#include <iostream>
using namespace std;
 
void countSort(int data[], int len)

    //find the min, max value of the array data
    int min = data[0];
    int max = min;
    for(int i = 1; i < len; i++)
    
        if(data[i] < min )
            min = data[i];
 
        if(data[i] > max)
            max = data[i];
    
 
    //Initialize the temp array
    int* temp = new int[max-min+1];
    for(int i = 0; i < max-min+1; i++)
        temp[i] = 0;
 
    //Count the time that appears in the array, then mark it in the temp array
    for(int i = 0; i < len; i++)
        temp[data[i] - min]++;
 
    //Go through the temp array, assign the value back to target array accroding to each data appear time.
    int j = 0;
    for(int i = 0; i < max-min+1; i++)
    
        while((temp[i]--) > 0)
            data[j++] = min + i;
    
 
    delete[] temp;
 

 
int main() 
 
    int arr[10] = 1,5,4,3,7,6,9,10,8,2;
    countSort(arr, 10);
 
    for(int i = 0; i < 10; i++)
        cout << arr[i] << endl;
 
    return 0;

以上是关于ACM教程 - 计数排序的主要内容,如果未能解决你的问题,请参考以下文章

计数排序真的不重要?

ACM教程 - 希尔排序

排序算法(快速排序)

ACM教程 - 插入排序

ACM教程 - 选择排序

ACM教程 - 冒泡排序