这篇文章主要介绍Java如何排一亿个随机数,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!思路 : 字面意义,插入是将某一元素按某种规则放入到特定集合中 ,因此我们需要将序列划分成为两块 ,一部分为有序集合, 另一部分为待排序集合图解 :为了方便理解,我们就按最最最特殊的4321序列来举例,根据上述的思路 ,我们需要将序列划分为两部分, 为了编码方便,我们将第一个元素假设为有序集合, 那么我们的循环应当是从第2个元素开始的,也就是3为避免后面操作把3覆盖掉了 , 我们选择一个临时变量来保存3.也就是上文的 val=arr[1]
,由于是对数组继进行操作 , 我们同时也需要获取有序集合的最后一个元素的索引作为游标当游标不越界 , 且待插入的值小于游标指示位置时(上图的4) , 我们将元素4后移 , 游标前移,继续检查集合中的其它元素是否也小于待插入的元素, 直到游标越界
上图由于集合内只有一个4, 游标前移越界了, 因此循环终止. 下一轮比较开始执行实际运行80w免费云主机域名个数据耗时1分4秒(非准确值,每台机器可能都不一样)直接插排在排序记录较少, 关键字基本有序的情况下效率较高时间复杂度 :关键字比较次数 : KCN=(n^2)/2
总移动次数 : RMN= (n^2)/2
因此时间复杂度约为 O(N^2)
这里最难理解的应该是第三个for循环,j = i - gap
, 表示小组内的第一个元素,即j=0
,当小组内的第一个元素大于第二个元素时(由于是逻辑上的分类,第二个元素的索引应当是第一个元素的所有值+增量gap) , 交换两者,反之j-=gap
,继续比较或跳出循环 ,如此往复将所有小组都遍历完之后 , 缩小增量(即gap/=2
) , 然后继续上述步骤, 直到增量gap为1时, 序列排序结束希尔排序的时间复杂度取决于增量序列的函数 , 需要具体问题具体分析,并不是一个确定的值,这也是第四点需要讨论的问题上述我们在做排序的时候增量缩减选用的时gap/=2
的模型, 这并不是最优的选择 , 关于增量的选取 , 属于数学界尚未解决的一个问题但是可以确定的是, 通过大量的实验证明 ,当n->无穷大
时, 时间复杂度可以减少到 :在下一点, 移位法中 , 我们也做了几个实验 , 可以肯定的时,对于一定规模内(如800w~1亿) 的计算, 希尔排序的速度远远超过了堆排序, 至少在笔者的电脑上是这样的交换法的速度比移位法慢很多 ,因此更多的是使用地移位法,并且移位法相较于交换法, 更”像”插入排序思路其实就是上述两种排序的结合 , 将分组 与 插入的优点结合到一起, 效率非常高体现的就是分治的思路,将一个较大序列切割成若干较小序列
以上是“Java如何排一亿个随机数”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注百云主机行业资讯频道!
相关推荐: query string、formData和request payload的区别是什么
这篇文章主要讲解了“query string、formData和request payload的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“query string、formData和request…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。