• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

JAVA十大排序算法之计数排序详解

java 搞代码 4年前 (2022-01-05) 24次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了java中的计数排序,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

计数排序

一种非比较排序。计数排序对一定范围内的整数排序时候的速度非常快,一般快于其他排序算法。但计数排序局限性比较大,只限于对整数进行排序,而且待排序元素值分布较连续、跨度小的情况。

如果一个数组里所有元素都是整数,而且都在0-k以内。对于数组里每个元素来说,如果能知道数组里有多少项小于或等于该元素,就能准确地给出该元素在排序后的数组的位置。

如给定一个0~5范围内

来源gao!%daima.com搞$代*!码网

的数组[2,5,3,0,2,3,0,3],对于元素5为其中最大的元素,创建一个大小为(5-0+1 = 6)的计数数组,如果原数组中的值对应计数数组的下标,则下标对应计数数组的值加1。

问题

上面是通过数组的最大值来确定计数数组的长度的,但如果需要对学生的成绩进行排序,如学生成绩为:[95,93,92,94,92,93,95,90],如果按照上面的方法来处理,则需要一个大小为100的数组,但是可以看到其中的最小值为90,那也就是说前面 0~89 的位置都没有数据存放,造成了资源浪费。

如果我们知道了数组的最大值和最小值,则计数数组的大小为(最大值 – 最小值 + 1),如上面数组的最大值为99,最小值为90,则定义计数数组的大小为(95 – 90 + 1 = 6)。并且索引分别对应原数组9095的值。我们把090的范围用一个偏移量来表示,即最小值90就是这个偏移量。

代码实现

 public class CountSort { public static final int[] ARRAY = {2, 5, 3, 0, 2, 3, 0, 3}; public static final int[] ARRAY2 = {95,93,92,94,92,93,95,90}; //优化前 private static int[] sort(int[] array) { if (array.length max) { max = i; } } //初始化一个计数数组且值为0 int[] countArray = new int[max + 1]; for (int i = 0; i <countArray.length; i++) { countArray[i] = 0; } //填充计数数组 for (int temp : array) { countArray[temp]++; } int o_index = 0;//原数组下标 int n_index = 0;//计数数组下标 while (o_index max) { max = i; } if (i <min) { min = i; } } //定义一个偏移量,即最小值前面0~min的范围,这里直接用一个负数来表示 int bias = 0 - min; //初始化一个计数数组且值为0 int[] countArray = new int[max - min + 1]; for (int i = 0; i <countArray.length; i++) { countArray[i] = 0; } for (int temp : array) { countArray[temp + bias]++; } //填充计数数组 int o_index = 0;//原数组下标 int n_index = 0;//计数数组下标 while (o_index 

时间复杂度

很明显,在排序过程中,我们至少遍历了三次原始数组,一次计数数组,所以它的复杂度为Ο(n+m)。因此,计数排序比任何排序都要块,这是一种牺牲空间换取时间的做法,因为排序过程中需要用一个计数数组来存元素组的出现次数。

算法稳定性

在新建的计数数组中记录原始数组中每个元素的数量,如果原始数组有相同的元素,则在输出时,无法保证元素原来的排序,是一种不稳定的排序算法。

总结

以上就是JAVA十大排序算法之计数排序详解的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:JAVA十大排序算法之计数排序详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址