我想修改QuickSort(在Java中),以便每次调用分区时,比例数组的中位数都用作轴。
我在Java中有一个中值选择算法,它返回第k个最小元素,在本例中是中位数。我在java中有大量的快速排序算法,它们都可以自己工作并对数组进行排序。不幸的是我无法将这两者结合起来以实现上述目标......每次我尝试它时,我通常会得到stackoverflow错误。
有人能告诉我代码,看看它是如何完成的吗?
由于
编辑:例如,这是我尝试使用的中位数选择算法。
public int quickSelect(int[] A, int p, int r, int k) {
if (p==r) return A[p];
int q = Partition(A,p,r);
int len = q-p+1;
if (k == len) return A[q];
else if (k<len) return Select(A,p,q-1,k);
else return Select(A,q+1,r,k-len);
}
public int partition(int[]A, int p, int r) {
int x = A[r];
int i = p-1;
for (int j = p; j<=r-1; j++) {
if (A[j] <= x) {
i++;
swap(A,i,j);
}
}
swap(A,i+1,r);
return i+1;
}
它本身可以工作但是当我尝试通过quicksort的分区函数调用quickSelect来返回要使用的数据透视表时,它不起作用。显然我做错了但我不知道是什么。不幸的是,在互联网上我还没有发现任何算法,即使是伪代码,也会将中位数选择与快速排序结合起来。
答案 0 :(得分:0)
获得中位数的标准方法是对数据进行排序。并且您希望通过在中位数上划分来对数据进行排序。这对我来说似乎非常鸡肉和鸡蛋。
您能详细说明为什么要对中位数进行分区/转动吗?
答案 1 :(得分:0)
您正在寻找的是选择算法。这是一个link with pseudocode。
从链接:
在计算机科学中,选择算法是一种用于在列表中找到第k个最小数字的算法
要查找要在列表中找到k = floor((n + 1)/ 2)最小数字的中位数,其中n是列表的大小。
答案 2 :(得分:0)
请注意,在PARTITION
中,pivot
为A[r]
。
public int QUICKSORT2(int[] A, int p, int r) {
if (p<r) {
int median=Math.floor((p + r) /2) - p + 1
int q=SELECT(A, p, r, median)
q=PARTITION2(A, p, r, q)
QUICKSORT2(A, p, q-1)
QUICKSORT2(A, q+1, r)
}
}
public int PARTITION2(int[]A, int p, int r, int q) {
int temp = A[r];
A[r]=A[q];
A[q]=temp;
return PARTITION(A, p, r)
}
答案 3 :(得分:0)
您可以使用此...
int Select(int array[],int start, int end,int k){
if(start==end){
return start;
}
int x=array[end];
int i=start-1;
for(int j=start;j<=end-1;j++){
if(array[j]<x){
i++;
Swap(array+i,array+j);
}
}
i++;
Swap(array+i,array+end);
if(i==k){
return i;
}
else if(i>k){
return Select(array,start,i-1,k);
}
else{
return Select(array,i+1,end,k);
}
}
选择将在数组中第k个最小元素上分区数组;