冒泡排序第1版
冒泡排序第2版
对于数列{3, 4, 2, 1, 5, 6, 7, 8},
前半部分:{3, 4, 2, 1}无序,
后半部分:{5, 6, 7, 8}有序,
如果采用第二版的算法,依然不是最好的,因为第二版会把后半部分无用功地重新排序,这个问题的关键点在于对数列有序区的界定。而有序区的长度=排序的轮数。故设置多下方两个变量。
int lastIndex = 0;//最后一次交换下标 int sortBorder = array.length-1;//无序数组边界
package chapter4.part1; import java.util.Arrays; import org.junit.Test; public class BubbleSort3 { @Test public void testBS1() { int[] array = new int[] {3, 4, 2, 1, 5, 6, 7, 8}; System.out.println("数组排序前: " + Arrays.toString(array)); int lastIndex = 0;//最后一次交换下标 int sortBorder = array.length-1;//无序数组边界 for(int i=0; i<array.length; i++) {//控制回合 boolean isSort = true; for(int j=0; j<sortBorder; j++) { int temp = 0;//temp放在哪里初始化都行,因为temp不参与值大小比较 if(array[j]>array[j+1]) { temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; isSort = false;//发生过交换,说明之前无序 lastIndex = j; } } sortBorder = lastIndex; if(isSort) {//数组已有序,立即终止循环,之后的回合没必要继续下去 break; } } System.out.println("数组排序后: " +Arrays.toString(array)); } }测试用例: