作战大师Qcm —— 原创代码, 转载请附注出处。
/**
* @name bubbleSortInTwoWay() 双向冒泡排序
* @param list
* @variable rightBorder "有效冒泡区域" 的 右侧边界
* @variable leftBorder "有效冒泡区域" 的 左侧边界
* @variable rightPointer "上一轮升序循环中" 最后一次出现 "元素交换动作" 的 [下标位置]
* @variable leftPointer "上一轮降序循环中" 最后一次出现 "元素交换动作" 的 [下标位置]
*/
private static int[] bubbleSortInTwoWay(int[] list) {
int leftPointer = 0;
int rightPointer = list.length;
int leftBorder = 0;
int rightBorder = 0;
int count = 0;
while (leftPointer < rightPointer) {
rightBorder = rightPointer;
for (int i = leftPointer +1; i < rightBorder; i++) {
count++;
if (list[i] < list[i-1]) {
list[i] = list[i-1] + (list[i-1] = list[i])*0;
rightPointer = i;
}
}
if (rightBorder == rightPointer) break;
leftBorder = leftPointer;
for (int i = rightPointer - 1; i > leftBorder ; i--) {
count++;
if (list[i] < list[i-1]) {
list[i] = list[i-1] + (list[i-1] = list[i])*0;
leftPointer = i;
}
}
if (leftBorder == leftPointer) break;
}
System.out.println(count + " 次");
return list;
}
[12,18,19,21,22,25,26,30,30,33,37,45,46,47,52,52,54,59,70,83]
双向冒泡要点:
1. 双向冒泡结束循环的情况有二种
① 下一轮循环的冒泡边界 = 当前轮循环结束后的末位元素下标 (意味着没发生交换)
② 左侧边界值不断上升后, 反超右侧边界值
2. 参与双向冒泡的角色有两侧边界值 和 双向下标
3. 边界值随着元素交换而改变, 而下标只会在一轮内循环结束后再改成新的边界值. 在内循环期间, 下标不会发生变化.