为什么此insertionSort代码不能提供正确的输出? 公共类优先{ 公共静态void main(字符串[]args){ int[]arr=新的int[]{4,2,7,8}; int[]p=插入排序(arr); System.out.println(java.util.array.toString(p)); } 公共静态int[]插入排序(int[]arr){ int键; int i; 对于(int j=1;j0)和&(arr[i]>key)){ arr[i+1]=arr[i]; 我--; } arr[i+1]=键; } 返回arr; } }
我不确定发生了什么,但上面的代码只是打印原始的未排序数组,而不是已排序的int数组。为什么此insertionSort代码不能提供正确的输出? 公共类优先{ 公共静态void main(字符串[]args){ int[]arr=新的int[]{4,2,7,8}; int[]p=插入排序(arr); System.out.println(java.util.array.toString(p)); } 公共静态int[]插入排序(int[]arr){ int键; int i; 对于(int j=1;j0)和&(arr[i]>key)){ arr[i+1]=arr[i]; 我--; } arr[i+1]=键; } 返回arr; } },java,sorting,insertion-sort,Java,Sorting,Insertion Sort,我不确定发生了什么,但上面的代码只是打印原始的未排序数组,而不是已排序的int数组。 public class First{ public static void main(String[] args){ int[] arr = new int[]{4, 2, 7, 8}; int[] p = insertionSort(arr); System.out.println(java.util.Arrays.toString(p));
public class First{
public static void main(String[] args){
int[] arr = new int[]{4, 2, 7, 8};
int[] p = insertionSort(arr);
System.out.println(java.util.Arrays.toString(p));
}
public static int[] insertionSort(int[] arr){
int key;
int i;
for (int j = 1; j < arr.length; j++){
key = arr[j];
i = j - 1;
while( (i > 0) && (arr[i] > key)){
arr[i + 1] = arr[i];
i--;
}
arr[i + 1] = key;
}
return arr;
}
}
应该是
while ((i > 0) && (arr[i] > key)) {
然后我得到
while ((i >= 0) && (arr[i] > key)) {
使用调试器逐步完成流程。让别人指出你的错误不会给你那种发现你自己的错误的惊人的、有益的感觉。我会给你一个提示,试着在循环中为代码中的每个重要变量添加一些SOUT(system.out.println),然后通过添加一个1秒的sleep函数,自己看看你的循环在做什么。这真的有助于实时查看正在发生的事情(或者调试最终是一样的)@MohammedHousseynTaleb-这真的是调试的艰难之路。学习使用调试器,并逐步完成代码,这样做会更好,而且省力得多。您可以在您喜欢的任何时候检查您想要的任何变量,并在特定变量达到特定值时使用条件断点之类的东西来停止流。学习使用调试器对于程序员来说是一项非常有价值的技能。使用
println
和sleep
-没有那么多。@DavidWallace我当然同意你的观点,因为我也使用调试器,但从算法角度来说,通过打印和睡眠创建自己的调试器可以帮助(新的)程序员了解他在做什么,而写作只是一种思维练习。但你是对的,我支持你的观点。
[2, 4, 7, 8]