计数排序详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计数排序详解
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
4using namespace std;
5
6int main()
7 {
8int n;
9 cin >> n;
10int *a = new int[n];
11int *c = new int[n];
12 memset(a, 0, n*sizeof(int));
13 memset(c, 0, n*sizeof(int));
14int max = 0;
15for (int i = 0; i < n; i++)
16 {
17 cin >> a[i];
18 max = a[i]>max ? a[i] : max;
19 }
20int *b = new int[max+1];
21 memset(b, 0, (max+1)*sizeof(int));
22for (int i = 0; i < n; i++)
23 {
24 b[a[i]]++;
25 }
26for (int i = 1; i < max + 1; i++)
27 {
28 b[i] = b[i] + b[i - 1];
29 }
30for (int i = 0; i < n; i++)
31 {
32 b[a[i]]--;
33 c[b[a[i]]] = a[i];
34 }
35for (int i = 0; i < n; i++)
36 cout << c[i] << endl;
37delete[]a;
38delete[]b;
39delete[]c;
40
41return0;
42 }
运⾏结果;
10
2 1
3
4 2
5
6 1 8 11
1
1
2
2
3
4
5
6
8
11
请按任意键继续. . .
这就是传说中的时间复杂度只有O(n)的排序算法;。