排序算法总结之计数排序 Counting Sort
来源:互联网 发布:钢琴软件手机版 编辑:程序博客网 时间:2024/05/16 13:40
算法原理:
排序算法根据排序的原理可以分为两类:基于比较的和非比较的。常见的基于比较的排序算法有快速排序,堆排序,归并排序等,基于比较的排序算法平均情况最好是O(nlogn)。基于非比较的排序算法有三种:计数排序,计数排序和桶排序,它们的复杂度为O(n)。
计算排序算法的思想是:对于数组中的 某一个元素x,统计小于x的元素的个数,基于这一信息,在输出的数组上把x放在相应的位置上。
下图是算法导论计数排序部分的示例图。A数组是待排序的输入数组,C是用来存放小于数组中某个元素个数的辅助存储数组。首先对数组中元素的信息进行统计放在C中,然后根据C中的信息得到排序的数组。
算法伪代码:
算法的伪代码出自算法导论中计数排序部分:
COUNTING-SORT(A, B, k)
1. let C[0...k] be a new array2. for i=0 to k3. C[i] = 04. for j=1 to A.length5. C[A[j]] = C[A[j]] + 16.//C[i] now contains the number of elements equals to i7. for i=1 to k8. C[i] = C[i] + C[i-1]9.//C[i] now contains the number of elements less than or equal to i10.for j=A.length downto 111. B[C[A[j]]] = A[j]12. C[A[j]] = C[A[j]] - 1
算法性能分析:
时间复杂度分析:根据伪代码很容易看出计算排序的时间复杂度是O(n)。
空间复杂度分析:O(n)
稳定性:稳定
适用场景:1. 待排序的数组为非负整数
2. 知道待排序数组的取值范围3. 数组中的最大数比总数小(数据范围大的数组会消耗大量的时间和内存)4. 基数排序中对每一位的排序使用计数排序
Java版本代码实现:
private void sort(int[] A, int[] B, int k){int[] C = new int[k];for(int i=0;i<A.length;i++)C[A[i]]++;for(int i=1;i<k;i++)C[i] += C[i-1];for(int i=A.length-1;i>=0;i--){B[C[A[i]]-1] = A[i];C[A[i]]--;}}
0 0
- 排序算法总结之计数排序 Counting Sort
- 经典排序算法 - 计数排序Counting sort
- Counting sort-计数排序算法之Java实现
- 计数排序(Counting-Sort)
- 计数排序:counting-sort
- 计数排序(Counting Sort)
- 计数排序 Counting Sort
- Counting sort 计数排序
- 计数排序Counting sort
- 计数排序Counting sort
- 计数排序Counting sort
- 计数排序-Counting sort
- 计数排序-Counting Sort
- 排序总结系列九:计数排序(Counting sort)
- java计数排序(counting sort)
- 计数排序 (Counting Sort)
- 计数排序(Counting Sort)
- 计数排序(Counting Sort)
- volatile的作用
- hadoop学习笔记3 hadoop2.5.2单机模式环境配置和eclipse运行
- SHELL脚本学习指南——背景知识
- shader 入门 《从固定图形管线到可编程流处理器》
- UITableView和UICollectionView的cell重用问题
- 排序算法总结之计数排序 Counting Sort
- 线程的笔记1 wait yield join interrupt deamon 死锁使用方法
- rails render partial 参数 变量说明
- 【转载】J2SE知识点归纳笔记(三)---Java面向对象 Part 2
- com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
- 《php核心技术与最佳实践》笔记7
- 黑马程序员-Java的基本数据运算
- Objective-C分类 (category)和扩展(Extension)
- AndroidStudio开启代码混淆Progurad功能,防止你的app被反编译