Java10万个数排序方法_十万个无序数字怎么快速排序

本文介绍了如何使用桶排序算法在Java中高效地对10万个无序数字进行排序,通过牺牲空间换取时间,达到O(n)的时间复杂度。文章包含C语言实现代码,并讨论了在ACM竞赛中面对时间限制时,桶排序的优势以及可能出现的问题和解决方案。
摘要由CSDN通过智能技术生成

首答,欢迎追问与提意见,先说我的思路,用桶,以空间换时间的方式得到最快速度的答案,C代码在最下面,已测试。

测试结果:

3bc48f9a6280545b017a6789476895f5.png

思考了一会,按照常规方法走,如果没有特殊要求,用排序是可以的。最快的排序算法是时间复杂度是 O(nlogn)

十万的数据量的复杂度,也就是进行 100000*log(100000) = 17万次运算。

以现在计算机的运算速度(单位是每秒百万条指令),如果你不是做一些有时间限制的竞赛(ACM)的话,是完全可以的。

但这道题如果放在ACM竞赛中,如果用排序方法去做应该是铁铁的超时了。

于是我用桶(C语言桶的概念不懂请百度)做了一个以空间换时间的折中算法,时间复杂度是O(n),也就是10万次运算。空间复杂度取决于最大数字。如果最大数字是10万,就要开辟10万的数组空间,如果最大数字是20万,就要开辟20万的数组空间。如果最大数字是一百万,就要开辟一百万数组大小的空间,C语言不支持开辟这么多连续的内存空间,如果你真有这个问题,可以在segmentfault上提一个新问题,或者在答案下追问。

具体思路:

结果分为两个堆:0堆和1堆。

用桶存放所有元素的出现次数,对桶进行遍历,记录数组中所有的元素出现次数之和为count࿰

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值