作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Java 中为我的 Algorithms 类实现合并排序。我尝试了多种方法,包括使用 Java 的 Double.POSITIVE_INFINITY 值(类型转换为整数)将两个数组中的最后一个数组索引指定为“无穷大”。
import java.util.Arrays;
public static int[] mergeSort(int[] arr, int p, int r){
int[] sortedArray = new int[1];
if(p<r){
int q = (int)Math.floor((p+r)/2);
mergeSort(arr,p,q);
mergeSort(arr,q+1,r);
sortedArray = merge(arr,p,q,r);
}
return sortedArray;
}
public static int[] merge(int[] arr, int p, int q, int r){
//I've tested here with an array of size two, and left returns an array
//length of zero. I'm not sure if it might have to do with how the base case
//of size 1 arrays is handled.
int[] left = Arrays.copyOfRange(arr,p,q);
int[] right = Arrays.copyOfRange(arr,q+1,r);
int i = 0, j = 0;
int k;
//merge the two arrays; check to see if the i or j indexes are out of range
//before attempting to merge
for(k = p; k <= r-1 && i < left.length && j < right.length; k++){
if(left[i] <= right[j]){
arr[k] = left[i];
i++;
}else{
arr[k] = right[j];
j++;
}
}
//I was handling these assignments in the loop above, but my index variables were going
//out of range when Arrays.copyOfRange() returned arrays of length 0.
if(i >= left.length && j < right.length){
while(j < right.length){
arr[k] = right[j];
j++;
}
}else if(j >= right.length && i < left.length){
while(i < left.length){
arr[k] = left[i];
i++;
}
}
return arr;
}
我认为我的问题只是几个索引值稍微偏离了一点,但我无法弄清楚它们在我的生活中会在哪里。
最佳答案
在您的通话中Arrays.copyOfRange(arr,p,q)
,范围从 p(包括)到 q(不包括)。
如果 p 和 q 相等,结果将是零长度数组。
在您自己的方法签名中,考虑并记录端点是否 r
是包容性的还是排他性的。
此外,请考虑当您的测试 if(p<r)
时会发生什么mergesort() 失败——返回一个新的 1 元素数组,而不更改其默认成员。
关于java - 归并排序实现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22049705/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!