段晓雪:排序五非比较排序(计数排序&&基数排序)

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、代码实现

段晓雪:【排序五】非比较排序(计数排序&&基数排序)

段晓雪:【排序五】非比较排序(计数排序&&基数排序)

段晓雪:【排序五】非比较排序(计数排序&&基数排序)


          运行结果:



 End


比特教育科技

一家专注于做IT行业就业的咨询公司


以上是关于段晓雪:排序五非比较排序(计数排序&&基数排序)的主要内容,如果未能解决你的问题,请参考以下文章

非比较排序 (计数排序 && 基数排序)

每日算法计数&基数&桶&位图排序-简介

常见的排序算法( 归并排序,计数排序 , 基数排序)

排序算法非比较排序:计数排序基数排序桶排序

非比较排序之计数排序

java-数组排序--计数排序桶排序基数排序