【发布时间】:2016-02-05 10:57:41
【问题描述】:
我在尝试使用分而治之的算法时遇到问题。
给定一个未排序的数组 T v[] 查找该数组的 v[k] 元素,就好像该数组已排序但未对数组进行排序 v .
例如,如果 k = 3 和 v = {2, -1, -6, 7, 4} 该数组的第 k 个元素是 2。
由于我无法编辑传递的数组,我想不出另一种方法来对数组进行排序,而不将其保存在另一个局部变量中或尝试像快速排序一样划分数组并返回 的最后一个元素的位置v 应该是。
如果有帮助,这是我的代码:
public static <T extends Comparable<? super T>> T kesimoRec(T v[], int izq, int der, int k) {
if(izq < der){
int inf = izq-1;
T pivote = v[der];
for(int i = izq; i < der; ++i){
if(pivote.compareTo(v[i]) >= 0){
++inf;
}
}
++inf;
if(inf > izq + k-1){
return (kesimoRec(v, izq, inf-1, k));
}else if( inf < izq + k-1){
return (kesimoRec(v, inf+1, der, k-inf+izq-1));
}else{
return v[inf];
}
}else{
return v[der];
}
}
【问题讨论】:
-
这不是quickselect吗?
-
@MikeSamuel - 我的印象是大多数快速选择的实现都进行了部分排序。
-
@rcgldr,是的,我认为输入已修改到位。如果数组不是共享的 btw 线程,您可能会调整 quickselect 以在找到元素保持不变后交换回来。
-
@MikeSamuel - 大多数快速选择算法需要对数据进行部分排序以找到第 k 个索引,这就是快速选择的分区阶段所做的。如果不修改原始数据,则可以使用原始数组的副本。
标签: java arrays algorithm sorting divide-and-conquer