- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我试图使用 java 实现合并排序,但它说:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at HelloWorld.merge(HelloWorld.java:42)
at HelloWorld.sort(HelloWorld.java:30)
at HelloWorld.sort(HelloWorld.java:28)
at HelloWorld.sort(HelloWorld.java:29)
at HelloWorld.sort(HelloWorld.java:28)
at HelloWorld.main(HelloWorld.java:10)
所以我尝试将原始数组复制到合并子例程中的辅助数组中,我认为这是我用于辅助数组的长度搞乱了一切,“r-l+1”不是辅助数组的长度吗?
如果我将 100 作为辅助数组的长度,代码可以工作,但显然当原始数组的大小变大时它就不会工作。
请提前提供帮助并致谢。
public class HelloWorld{
public static void main(String []args){
HelloWorld ms = new HelloWorld();
int arr[] = new int[]{4,3,0,1,3,2,4,20,13,22,10};
ms.sort(arr, 0, arr.length - 1);
ms.printArr(arr);
}
void printArr(int arr[])
{
int n = arr.length;
for(int i = 0; i<n; i++){
System.out.print(" "+arr[i]);
}
}
void sort(int arr[], int l, int r)
{
if(l<r){
int m = (l+r)/2;
sort(arr, l, m);
sort(arr, m+1, r);
merge(arr, l, m, r);
}
}
void merge(int arr[], int l, int m, int r)
{
//find out helper array length
int helper[] = new int[r-l+1];
// Your code here
for(int i=l; i<=r; i++){
helper[i] = arr[i];
}
int i = l;
int k = l;
int j = m+1;
while(i<=m && j<=r){
if(helper[i]<=helper[j]){
arr[k]=helper[i];
i++;
}else{
arr[k]=helper[j];
j++;
}
k++;
}
while(i<=m){
arr[k]=helper[i];
i++;
k++;
}
}
}
最佳答案
如果我理解您尝试正确实现合并排序算法的 MERGE 子例程的方式,则您正在将数组的相关部分(从索引 l
,包括在内,到索引 l
,包括在内)复制到辅助数组中,然后使用复制到辅助数组中的数据修改原始数组。
在这种情况下,辅助数组的长度确实应该是 r-l+1
。但是,看看将原始数组部分复制到辅助数组中的代码,您不会偏移 for
中的索引。环形。正确的做法是:
int helper[] = new int[r-l+1];
for (int i = l; i <= r; i++){
helper[i-l] = arr[i];
}
不要忘记数组是零索引的!
但是,如果您绝对必须复制数组,我确实建议您采用更现代的复制数组的方法。在这种情况下,我认为最适合的是系统调用 System.arraycopy(arr, l, helper, 0, r-l+1)
。如果您想了解有关在 Java 中(完全或部分)复制数组的不同方法的更多信息,请查看 this answer出来。
关于java - 用Java实现归并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59806514/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!