段晓雪:排序五非比较排序(计数排序&&基数排序)
Posted 西安比特教育
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了段晓雪:排序五非比较排序(计数排序&&基数排序)相关的知识,希望对你有一定的参考价值。
博主:比特17班段晓雪
原创博文:58篇
博客访问量:170834
博客链接:欢迎关注
http://blog.csdn.net/snow_5288/article/details/60588561
不用点,点不开
先复制,粘贴到网页上去看看~
一、计数排序
1、基本思想
给定一组要排序的序列,找出这组序列中的最大值,然后开辟一个最大值加1大小的数组,将这个数组里面的元素全部置零,然后用这个数组统计出要排序的序列中各个元素出现的次数。等到统计完成的时候,排序就已经完成了。
图解(假设升序):
2、算法执行步骤:
1>找出待排序序列里的最大值max;
2>开辟一个大小为max+1的临时数组tmp ,将数组元素的所有初值赋为0;
3>遍历待排序序列,将序列中出现值作为下标,对tmp 数组的对应位置数据进行++;
4>上述操作完成后,tmp中统计了每个数据在待排序列中出现的次数;
3>最后,将tmp数组里值不为0的所有下标拷进原序列(注意同一个下标可能有多个重复值,都要进行拷贝,不能遗漏),排序就算完成。
3、计数排序的优化
从上面的例子中可以看出,3是待排序序列的最小值,在tmp数组中3 之前的位置并没有什么卵用,那么基于节省空间的角度进行考虑,我们可以开辟更小的临时数组统计次数,同样能完成排序。
比如要对1000,999,1008这三数进行排序,按照普通的方法前998个空间都被浪费掉了,所以这时候我们对它进行优化。找出要排序的这组元素中的最大值和最小值,这样就确定了这组元素的范围,然后开辟这个范围加1大小的数组,然后再将要排序的元素映射到这个新开辟的数组中就可以了。
结论:计数排序适用于数据比较集中的序列排序。
4、时间复杂度&&空间复杂度
计数排序是一种非比较的排序方法,它的时间复杂度是O(N+K),空间复杂度是0(K),其中K是要排序的数组的范围。可以看出计数排序是一种以空间呢换取时间的方法。如果当K>N*logN的时候,计数排序就不是好的选择了,因为基于比较排序的算法的下限是O(N*logN)。
5、代码实现
运行结果:
二、基数排序
1、基数排序的分类
LSD-- Least Significant Digit first(从低位向高位排)
MSD-- Most Significant Digit first(从高位向低位排)
由于原理差不多,此文只针对LSD进行分析。
2、基本思想
基数排序又称"桶子法",它从低位开始将待排序的数按照这一位的值放到相应的编号为0到9的桶中。等到低位排完之后得到一个序列,再将这个序列按照次低位的大小进入相应的桶中。以此类推,直到将所有的位都排完之后,这组数就已经有序了。
图解(假设升序):
3、算法执行步骤
1》统计待排序序列中最大的数是几位数;
2》开辟一个与原数组大小相同的临时数组tmp;
3》用一个count数组统计原数组中某一位(从个位向高位统计)相同的数据出现的次数;
4》用一个start数组计算原数组中某一位(从个位向高位计算)相同的数据出现的位置;
5》将桶中数据从小到大(由顶至底)用tmp数组收集起来;
6》循环3》4》5》直到所有位都被统计并计算过,然后用tmp收集起来;
7》将tmp数组的数据拷回原数组,排序完成。
图解:
4、时间复杂度&&空间复杂度
基数排序是一种非比较排序,它的时间复杂度是O(N*digit),其中digit是这组待排序中的最大的数的数量级。基数排序的空间复杂度就是在分配元素时,使用的桶空间,所以基数排序的空间复杂度是O(N)。它是一种稳定的排序方法。
5、代码实现
运行结果:
比特教育科技
一家专注于做IT行业就业的咨询公司
以上是关于段晓雪:排序五非比较排序(计数排序&&基数排序)的主要内容,如果未能解决你的问题,请参考以下文章