一道面试题注记

介绍一种平均时间复杂度为O(n)的方法来找出数组中最大的N个数,并对比了快速排序方法。

[java]
public static int[] findTopNValues(int[] anyOldOrderValues, int n) {
Arrays.sort(anyOldOrderValues);
int[] result = new int[n];
System.arraycopy(anyOldOrderValues, anyOldOrderValues.length - n,
result, 0, n);
return result;
}
[/java]
Arrays.sort(int[])使用的是快排,平均的时间复杂度是O( n lg(n)),在一般情况下已经足够好。那么有没有平均情况下O(n)复杂度的算法?这个还是有的,这道题目其实是选择算法的变形,选择一个数组中的第n 大元素,可以采用类似快排的方式划分数组,然后只要在一个子段做递归查找就可以,平均状况下可以做到O(n)的时间复杂度,对于这道题来说稍微变形下算法即可解决:
[java]
/**

[/java]
选择算法还有最坏情况下O(n)复杂度的实现,有兴趣可以读算法导论和维基百科。题外,我测试了下这两个实现,在我的机器上大概有2倍多的差距,还是很明显。

本文来源于"阿里中间件团队播客",原文发表时间" 2010-10-28"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值