Java版MergeSort排序结果异常输出大量零的问题求助
归并排序输出异常求助
跟着BroCode的教程实现Java归并排序,输入数组{8,4,5,3,2,7,1,9,0,6},期望得到升序排序结果,但实际输出是0000002468。核对教程代码没发现问题,自己还没完全理解算法,求帮忙排查解决。
原代码
class m{ public static void main(String[]args){ int array[] = {8,4,5,3,2,7,1,9,0,6}; mergeSort(array); for(int i =0;i<array.length;i++){ System.out.print(array[i] + ""); } } private static void mergeSort(int[]array){ int length = array.length; if(length<=1)return;//base case int middle = length/2; int leftArray[] = new int[middle]; int rightArray[] = new int[length-middle]; int i=0;//left array int j = 0;//right array for(;i<length;i++){ if(i<middle){ leftArray[i] = array[i]; }else{ rightArray[j] = array[i]; } }mergeSort(leftArray); mergeSort(rightArray); merge(leftArray,rightArray,array); } private static void merge(int[]leftArray,int[]rightArray,int[]array){ int leftSize = array.length/2; int rightSize = array.length-leftSize; int i=0,l=0,r=0; // check conditions for merging while(l<leftSize && r<rightSize){ if(leftArray[l]<rightArray[r]){ array[i] = leftArray[l]; i++; l++; }else{ array[i] = rightArray[r]; i++; r++; } } while(l<leftSize){ array[i] = leftArray[l]; i++; l++; } while(r<rightSize){ array[i] = rightArray[r]; i++; r++; } } }
问题排查与修复
两个核心错误:
右数组赋值时未递增索引
j
在mergeSort的循环里,当i >= middle时,给rightArray[j]赋值后没有执行j++,导致右数组所有元素都被塞到rightArray[0],其余位置都是默认的0。这就是输出里一堆0的直接原因。merge方法中左右数组大小计算错误
原代码用array.length/2计算左数组大小,但递归时传入的array长度会动态变化,应该直接用leftArray.length和rightArray.length获取实际长度,避免计算偏差。
修复后的代码
class m{ public static void main(String[]args){ int array[] = {8,4,5,3,2,7,1,9,0,6}; mergeSort(array); for(int i =0;i<array.length;i++){ System.out.print(array[i] + " "); // 加空格让输出更清晰 } } private static void mergeSort(int[]array){ int length = array.length; if(length<=1)return;//base case int middle = length/2; int leftArray[] = new int[middle]; int rightArray[] = new int[length-middle]; int i=0;//left array int j = 0;//right array for(;i<length;i++){ if(i<middle){ leftArray[i] = array[i]; }else{ rightArray[j] = array[i]; j++; // 关键修复:赋值后递增右数组索引 } } mergeSort(leftArray); mergeSort(rightArray); merge(leftArray,rightArray,array); } private static void merge(int[]leftArray,int[]rightArray,int[]array){ int leftSize = leftArray.length; // 直接用左数组实际长度 int rightSize = rightArray.length; // 直接用右数组实际长度 int i=0,l=0,r=0; // 合并逻辑 while(l<leftSize && r<rightSize){ if(leftArray[l]<rightArray[r]){ array[i] = leftArray[l]; i++; l++; }else{ array[i] = rightArray[r]; i++; r++; } } while(l<leftSize){ array[i] = leftArray[l]; i++; l++; } while(r<rightSize){ array[i] = rightArray[r]; i++; r++; } } }
运行修复后的代码,输出会是0 1 2 3 4 5 6 7 8 9,符合预期。
内容的提问来源于stack exchange,提问作者DJ PRAGO_28
相关产品推荐
相关产品推荐

