计数排序的思想,时间空间复杂度细致分析以及java源代码实现
来源:互联网 发布:安卓版cad制图软件 编辑:程序博客网 时间:2024/05/19 11:49
参考文章:http://www.cnblogs.com/kaituorensheng/archive/2013/02/23/2923877.html
京东笔试的时候问了很多计数排序相关的东西,因为自己只了解了一些常用的排序,对于计数排序并没有深入研究导致答得不好,特别补上。
1. 计数排序的思想
计数排序是基于非比较排序,主要用于对于一定范围内的整数进行排序。采用的是空间换时间的方法。
假设序列中小于a的整数有n个,则应该把a放在n+1的位置,同时对于相同的整数要做调整不能把所有的整数都放在一个位置。
2.算法步骤
1.首先统计每一位上元素的个数
2,统计小于等于该位元素的个数
3.从后往前,将每个元素放到应该放置的位置。
3. java源代码实现
public class CountSort { public static void main(String args[]) { int[] a={3,4,5,3,3,5,4,7,6,8,5,6}; int[] b=sort(a); for(int i=0;i<b.length;i++) { System.out.println(b[i]); } } public static int[] sort(int[] a) { int len=a.length; if(len<=1) return a; int min=a[0]; int max=a[0]; for(int i=0;i<len;i++) { if(a[i]<min) min=a[i]; if(a[i]>max) max=a[i]; } //辅助数组的长度 int k=max-min+1; //辅助数组c int[] c=new int[k]; //统计某一位的元素的个数 for(int i=0;i<len;i++) { c[a[i]-min]++; } //统计小于等于该位的元素个数 for(int i=1;i<k;i++) { c[i]=c[i]+c[i-1]; } //把每一位放到应该的位置上 int[] b=new int[len]; for(int i=len-1;i>=0;i--) { int value=a[i]; //找到该值应该放置的位置 int pos=c[value-min]; b[pos-1]=value; c[value-min]--; } return b; }}
4. 算法复杂度分析:
空间复杂度:这个我们已经看到了,用了一个辅助数组C,一个辅助数组B,复杂度为o(n+k);
时间复杂度:我们看到遍历了两次n,一次k,大小也是o(n+k)
当k很小的时候,明显可以看到此算法复杂度比较快,适用于k较小,内存空间较大的情况。
0 0
- 计数排序的思想,时间空间复杂度细致分析以及java源代码实现
- 排序算法的时间复杂度以及空间复杂度 计数排序
- Java快速排序的实现和时间空间复杂度分析
- 排序算法的C语言实现以及各个算法的时间复杂度和空间复杂度分析(冒泡排序)
- 各种排序算法的思想以及时间复杂度,空间复杂度总结
- 快速排序实现以及时间复杂度分析
- 快速排序实现以及时间复杂度分析
- 浅谈直接插入排序算法思想以及时间复杂度分析
- 常用排序算法的时间复杂度以及空间复杂度
- 排序算法的时间复杂度以及空间复杂度
- JAVA实现计数排序(牺牲稳定性,换取空间复杂度)
- 插入排序算法的java实现及时间复杂度分析
- 插入排序和归并排序实现以及时间复杂度分析
- java 希尔排序 时间复杂度 空间复杂度
- 八大排序算法思想,时间复杂度,稳定性、及其java实现
- 2017/08/24 排序的时间、空间复杂度以及稳定性
- 排序算法的思想分析以及java实现
- 快速排序算法原理,实现,以及时间复杂度分析
- 向Python女神推荐这些年我追过的经典书籍
- 遗传算法最通俗的讲解案例
- Mac下 Lua 环境搭建
- Leetcode 34 Search for a Range
- 从HTML源代码和页面正文中提取特征向量
- 计数排序的思想,时间空间复杂度细致分析以及java源代码实现
- 在Jupyter Notebooks里进行大数据分析,So easy!
- 可以加载Gif动画和png等图片的方法和控件
- python挑战之level6
- 获取浏览器可见高度
- Android Studio SVN使用手册
- all I want is nothing more...
- 中缀表达式X=A+B*(C-(D+F))/E转后缀表达式之后是什么?
- 哪些工具可以用来进行Bug管理