Java冒泡排序仅返回部分排序结果的问题求助
你的冒泡排序问题排查与修复
嘿,刚看了你的代码,问题出在那个else分支里的swap = false!这会让你的排序提前终止,导致只完成部分排序。
问题核心原因
冒泡排序的逻辑是:只要某一轮循环中发生过至少一次交换,就说明数组还没完全有序,需要继续下一轮循环。但你的代码里,只要遇到一对不需要交换的元素,就立刻把swap重置为false——哪怕这一轮之前已经发生过交换,也会被强制改成false,直接让while循环停止。
举个例子,你的测试数组{5, 4, 6, 3, 12, 1}在第二轮循环时:
- 当
i=1,4<5不交换,swap被设为false - 之后
i=2,5>3交换,swap变回true - 但
i=3时5<6不交换,swap又被设为false - 最后
i=4交换后swap变回true,但i=5时6<12不交换,swap再次被设为false - 这一轮结束后
swap是false,while直接终止,此时数组还没完全有序。
修复后的代码
只需要去掉else分支的swap = false就行,因为swap初始值已经是false,只有发生交换时才需要设为true,全程不需要主动把它改回false:
class BubbleSort{ public static void main(String args[]){ int nums [] = {5, 4, 6, 3, 12, 1}; Boolean swap = true; while(swap){ swap = false; // 每轮开始先默认没有交换 for(int i = 1; i<nums.length ; i++){ if (nums[i - 1] > nums[i]){ int t = nums[i-1]; nums[i-1] = nums[i]; nums[i] = t; swap = true; // 只有交换发生时,才标记需要继续循环 } // 去掉else分支的swap=false! } } System.out.print("Sorted: "); for(int j=0 ; j<nums.length ; j++){ System.out.print(nums[j] + " "); } } }
额外优化(可选)
冒泡排序每一轮都会把当前最大的元素“冒”到数组末尾,所以下一轮循环不需要再比较已经排好的末尾元素,可以把循环长度减1,提升效率:
class BubbleSort{ public static void main(String args[]){ int nums [] = {5, 4, 6, 3, 12, 1}; Boolean swap = true; int lastUnsortedIndex = nums.length - 1; // 记录未排序的最后位置 while(swap){ swap = false; for(int i = 1; i<=lastUnsortedIndex ; i++){ // 只循环到未排序的位置 if (nums[i - 1] > nums[i]){ int t = nums[i-1]; nums[i-1] = nums[i]; nums[i] = t; swap = true; } } lastUnsortedIndex--; // 每轮结束,末尾多一个已排序元素 } System.out.print("Sorted: "); for(int j=0 ; j<nums.length ; j++){ System.out.print(nums[j] + " "); } } }
这样修改后,你的冒泡排序就能正常工作啦~
内容的提问来源于stack exchange,提问作者Nick Tamburro
相关产品推荐
相关产品推荐

