单独实现swap交换函数后冒泡排序运行失效是什么原因?
问题根因
这是Java参数传递机制导致的问题:Java中所有参数都是值传递:
- 你当前定义的
swap方法入参是两个int基本类型,调用swap(arr[j], arr[j+1])时,只是把数组两个位置的值拷贝了一份传给形参a、b,在swap内部修改a、b的值,完全不会影响原数组里的元素,交换逻辑本质没有生效,因此排序失效。 - 如果直接在冒泡循环里写交换代码,是直接修改数组对应下标的元素值,自然可以正常运行。
修复方案
- 方案1:修改
swap方法入参,传入数组本身和要交换的两个下标,直接操作数组元素(推荐)
修改后的swap方法如下:
void swap(int[] arr, int index1, int index2) { int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; }
同时把冒泡循环里的调用改为swap(arr, j, j+1)即可。
- 方案2:直接把交换逻辑写在冒泡排序的判断分支中,不抽离独立
swap函数。
修正后完整可运行代码
public class BubbleSort { void swap(int[] arr, int index1, int index2) { int temp = arr[index1]; arr[index1] = arr[index2]; arr[index2] = temp; } void sort(int arr[]) { int i, j, n=arr.length; for(i=0; i<n-1; i++) { for(j=0; j<(n-i-1); j++) { if(arr[j] > arr[j+1]) swap(arr, j, j+1); } } } public static void main(String[] args) { int i; int arr[] = {12, 3, 4, 10, 40, 89, 60, 55, 96, 11}; BubbleSort ob = new BubbleSort(); ob.sort(arr); System.out.println("Array after sorting:"); for(i=0; i<arr.length; i++) System.out.print(arr[i] + " "); } }
内容的提问来源于stack exchange,提问作者Markins
相关产品推荐
相关产品推荐

