计数排序详解
Posted Freedom314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计数排序详解相关的知识,希望对你有一定的参考价值。
1.计数排序是一种非常快捷的稳定性强的排序方法,时间复杂度O(n+k),其中n为要排序的数的个数,k为要排序的数的组大值。计数排序对一定量的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序。计数排序是消耗空间发杂度来获取快捷的排序方法,其空间发展度为O(K)同理K为要排序的最大值。
2.计数排序的基本思想为一组数在排序之前先统计这组数中其他数小于这个数的个数,则可以确定这个数的位置。例如要排序的数为 7 4 2 1 5 3 1 5;则比7小的有7个数,所有7应该在排序好的数列的第八位,同理3在第四位,对于重复的数字,1在1位和2位(暂且认为第一个1比第二个1小),5和1一样位于6位和7位。
3.计数排序的实现办法:
首先需要三个数组,第一个数组记录A要排序的数列大小为n,第二个数组B要记录比某个数小的其他数字的个数所以第二个数组的大小应当为K(数列中最大数的大小),第三个数组C为记录排序好了的数列的数组,大小应当为n。
接着需要确定数组最大值并确定B数组的大小。并对每个数由小到大的记录数列中每个数的出现次数。因为是有小到大通过出现次数可以通过前面的所有数的出现次数来确定比这个数小的数的个数,从而确定其位置。
对于重复的数,每排好一个数则对其位置数进行减减操作,以此对完成其余相同的数字进行排位。
1 #include<iostream> 2 #include<stdlib.h> 3 4 using namespace std; 5 6 int main() 7 { 8 int n; 9 cin >> n; 10 int *a = new int[n]; 11 int *c = new int[n]; 12 memset(a, 0, n*sizeof(int)); 13 memset(c, 0, n*sizeof(int)); 14 int max = 0; 15 for (int i = 0; i < n; i++) 16 { 17 cin >> a[i]; 18 max = a[i]>max ? a[i] : max; 19 } 20 int *b = new int[max+1]; 21 memset(b, 0, (max+1)*sizeof(int)); 22 for (int i = 0; i < n; i++) 23 { 24 b[a[i]]++; 25 } 26 for (int i = 1; i < max + 1; i++) 27 { 28 b[i] = b[i] + b[i - 1]; 29 } 30 for (int i = 0; i < n; i++) 31 { 32 b[a[i]]--; 33 c[b[a[i]]] = a[i]; 34 } 35 for (int i = 0; i < n; i++) 36 cout << c[i] << endl; 37 delete[]a; 38 delete[]b; 39 delete[]c; 40 41 return 0; 42 }
运行结果;
10
2 1 3 4 2 5 6 1 8 11
1
1
2
2
3
4
5
6
8
11
请按任意键继续. . .
这就是传说中的时间复杂度只有O(n)的排序算法;
以上是关于计数排序详解的主要内容,如果未能解决你的问题,请参考以下文章
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
九种经典排序算法详解(冒泡排序,插入排序,选择排序,快速排序,归并排序,堆排序,计数排序,桶排序,基数排序)