Java实现冒泡排序仅在数组元素≥5时报错,小数据量正常是何原因?
报错根因
你遇到的是StackOverflowError(栈溢出错误),触发原因有两个:
- 排序逻辑存在缺陷,递归无法正常终止
你的内层循环j固定从下标1开始遍历,没有和外层的i挂钩,当i遍历到靠后的下标时,会把之前已经放到数组前面的更小的元素再次交换回来,导致每轮排序都一定会产生交换操作,notDone标记永远为true,递归会无限执行下去。
当数组长度≤3时,刚好能在递归深度溢出前完成排序,所以不会报错;当数组长度≥5时,递归无法终止,最终耗尽栈空间触发报错。 - 递归实现本身不适合排序场景
就算逻辑修复,当数组长度较大时,递归深度过深依然会触发栈溢出,排序类逻辑更适合用迭代实现。
修复后的代码
import java.util.Arrays; import java.util.Scanner; public class sorting_v2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Choose how much number you want to sort:"); int sizeOfTab = scanner.nextInt(); int[] numbers = new int[sizeOfTab]; for (int i = 0; i < sizeOfTab; i++) { System.out.println("Choose number to collection: "); numbers[i] = scanner.nextInt(); } scanner.close(); System.out.println(Arrays.toString(sorting(numbers))); } private static int[] sorting(int[] numbers) { boolean notDone; for (int i = 0; i < numbers.length - 1; i++) { notDone = false; // 已经沉到末尾的有序元素不需要再比较,所以上限为length-1-i for (int j = 0; j < numbers.length - 1 - i; j++) { // 冒泡排序核心是比较相邻元素 if (numbers[j] > numbers[j+1]) { int tmp = numbers[j+1]; numbers[j+1] = numbers[j]; numbers[j] = tmp; notDone = true; } } // 本轮无交换说明已经完全有序,直接退出 if (!notDone) { break; } } return numbers; } }
内容的提问来源于stack exchange,提问作者tomeee121
相关产品推荐
相关产品推荐

