数据结构基础加强之计数排序
来源:互联网 发布:国内javascript现状 编辑:程序博客网 时间:2024/06/03 07:20
数据结构基础加强之计数排序
比较排序
常见的排序算法:快速排序,冒泡排序等属于比较排序,即最终的排序结果需要元素之间的比较。每个元素之间需要比较才能确定自己的位置。
在冒泡排序之类的排序中,问题规模为n,又因为需要比较n次,所以平均时间复杂度为O(n²)。在归并排序、快速排序之类的排序中,问题规模通过分治法消减为logN次,所以时间复杂度平均O(nlogn)。
非比较排序
非比较排序:不同比较就能确定元素的位置。如计数排序。
因为不需要通过比较,所有一次遍历即可解决。问题规模为n,算法时间复杂度O(n)。在时间上优于所有的比较排序算法。但这种做法需要消耗大量的空间,是以空间代价来换取时间的优越性。在规模很大时,对空间的要求很大,不适用于实际。
计数排序
因其需要占用大量的空间,所以适用于数据集比较小的情况。仅适用于数据比较集中的情况。
计数排序的基本思想是:对每一个输入的元素arr[i],确定小于 arr[i] 的元素个数。
所以可以直接把 arr[i] 放到它输出数组中的位置上。假设有5个数小于 arr[i],所以 arr[i] 应该放在数组的第6个位置上。
算法流程:
需要的数组:
待排序的数组int[] array = { 1, 9, 6, 8, 7, 3, 4, 2, 0 };
辅助计数数组int[] countArray = new int[max - min + 1] 记录数据出现的次数;
1. 找出待排序数组的最大值和最小值。max = 2,min = 0.
2. 实例化countArrray数组,记录每个元素出现的次数
3. 计算array中元素在countArray中的位置pos = array[index] - min.
4. 由countArray得到排序之后的数组。
代码实现:
public class CountSort { public static void main(String[] args) { int[] array = { 1, 9, 6, 8, 7, 3, 4, 2, 0 }; solution(array); for (int i : array) { System.out.print(i + " "); } } private static void solution(int[] array) { int max = array[0]; int min = array[0]; for (int i : array) { if (i > max) { max = i; } if (i < min) { min = i; } } int range = max - min + 1; int[] countArray = new int[range]; for (int i : array) { int pos = i - min; countArray[pos]++; } int index = 0; for (int i = 0;i < countArray.length;i++) { while (countArray[i]-- > 0) { array[index++] = i + min; } } }}
更多详细代码参考:https://github.com/Li-JY/algorithm-and-datastructure/tree/master/src/sort
- 数据结构基础加强之计数排序
- 数据结构基础加强之排序算法
- 数据结构之计数排序
- 数据结构基础加强之二叉树
- 数据结构基础加强之最小堆的实现与堆排序
- 基础数据结构算法_计数排序,基数排序,桶排序
- 【基础排序】计数排序
- 数据结构_计数排序
- [数据结构]计数排序
- 数据结构--计数排序
- 夕拾-数据结构-计数排序
- 数据结构-计数排序
- 基础算法系列(九)排序算法之计数排序
- 排序之计数排序
- 【数据结构与算法】计数排序
- C数据结构---计数排序实现
- 【数据结构】中的计数排序(CountSort)
- 【数据结构与算法】计数排序
- AngularJS表达式 与Javascript表达式的比较
- Android okHttp网络请求之Retrofit+Okhttp+RxJava组合
- 16. 3Sum Closest
- Android setOnLongClickListener()使用笔记
- sstream中stringstream的用法
- 数据结构基础加强之计数排序
- APK安装错误和解决方法
- Linux查看和剔除当前登录用户
- centos 7.2 mysql 安装
- 虚拟化技术kvm,xen,vmware比较
- Spring+SpringMVC+MAVEN+EasyUi 整合
- js 执行完一个函数之后再执行另外一个函数
- hibernate 对实体类的crud操作
- g++和gcc的比较