如何解决如何在 Java 中正确实现 Median-of-median 算法
我正在尝试实现中值算法/BFPRT算法的中值。
main 中数组的检查输出为 5,但是我的代码甚至没有达到
一个适当的输出(输出-1,因为它没有达到i>k 或i 任何帮助将不胜感激。 我越是在意它,我的代码就越是乱七八糟。
请原谅乱码:
import java.util.Arrays;
public class getMedian {
// Method for quickly returning a median
public static int getMedian(int[] list) {
Arrays.sort(list);
if (list.length == 0) {
System.out.println("Critical error,somehow passed empty list");
return 5000;
} else if (list.length <= 2) {
return list[list.length / 2];
} else {
return list[(list.length - 1) / 2];
}
}
// Method for getting the position of median from given list
public static int findMedianPos(int[] arr) {
int expectedMedianPos = 0;
if (arr.length % 2 == 0) {
expectedMedianPos = (arr.length / 2) - 1;
} else {
expectedMedianPos = (arr.length - 1) / 2;
}
return expectedMedianPos;
}
// Method for getting median of medians.
static int medianFinder(int[] arr,int[] orArr,int[] helperArr,int lowerBound,int upperBound,int medPos) {
int y = 0;
if (arr.length % 5 != 0) {
y = arr.length % 5;
} else {
y = 1;
}
int[] helper = new int[5];
int[] helper2 = new int[y];
int[] medians = new int[(int) Math.ceil(arr.length / 5.0)];
int medianPointer = 0;
if (arr.length <= 5) {
return partition(orArr,helperArr,getMedian(arr),medPos);
}
for (int i = lowerBound; i < upperBound; i++) {
helper[i % 5] = arr[i];
helper2[i % helper2.length] = arr[i];
if (i != lowerBound && (i + 1) % 5 == 0) {
medianPointer = medianPointer + 1;
}
if (i == upperBound - 1 && (i + 1) % 5 != 0) {
medians[medianPointer] = getMedian(helper2);
}
}
return medianFinder(medians,orArr,medians.length,medPos);
}
public static int partition(int[] partitionedLists,int partitionElem,int medPos) {
int b = 0;
for (int i = 0; i < orArr.length; i++) {
if (orArr[i] == partitionElem) {
b = i;
}
}
int sizeL1 = 0;
int sizeL2 = 0;
for (int i = 0; i < partitionedLists.length; i++) {
if (partitionedLists[i] < partitionedLists[b]) {
sizeL1 = sizeL1 + 1;
}
if (partitionedLists[i] > partitionedLists[b]) {
sizeL2 = sizeL2 + 1;
}
}
int[] L1 = new int[sizeL1];
int[] L2 = new int[sizeL2];
int counterL1 = 0;
int counterL2 = 0;
for (int i = 0; i < partitionedLists.length; i++) {
if (partitionedLists[i] < partitionedLists[b]) {
L1[counterL1] = partitionedLists[i];
counterL1 = counterL1 + 1;
} else if (partitionedLists[i] > partitionedLists[b]) {
L2[counterL2] = partitionedLists[i];
counterL2 = counterL2 + 1;
}
}
int k = sizeL1 + 1;
int i = medPos;
if(i<k) {
if(sizeL1 <= 5) {
Arrays.sort(L1);
return L1[medPos - 1];
} else {
medianFinder(L1,L1.length,i);
}
}
if(i>k) {
if(sizeL2 <= 5) {
Arrays.sort(L2);
return L2[medPos-1];
} else {
medianFinder(L2,L2.length,i);
}
}
return -1;
}
public static void main(String[] args) {
int[] numbers = {7,9,10,8,5,6,1,3,2,4};
System.out.println(medianFinder(numbers,numbers,numbers.length,findMedianPos(numbers)+1));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。