冒泡排序(双向) - Java

作战大师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. 边界值随着元素交换而改变, 而下标只会在一轮内循环结束后再改成新的边界值. 在内循环期间, 下标不会发生变化.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双向冒泡排序算法是一种改进的冒泡排序算法,它的原理和一般的冒泡排序相似,但是在每一轮的比较和交换中同时从前往后和从后往前两个方向进行,以提高排序的效率。 具体实现双向冒泡排序算法Java代码如下: ```java public class BidirectionalBubbleSort { public static void bidirectionalBubbleSort(int[] array) { int low = 0; // 从前往后的起始位置 int high = array.length - 1; // 从后往前的起始位置 while (low < high) { boolean isSorted = true; // 正向冒泡,将最大的元素交换到后面 for (int i = low; i < high; i++) { if (array[i] > array[i + 1]) { swap(array, i, i + 1); isSorted = false; } } high--; // 反向冒泡,将最小的元素交换到前面 for (int i = high; i > low; i--) { if (array[i] < array[i - 1]) { swap(array, i, i - 1); isSorted = false; } } low++; // 如果已经排序完成,则提前结束排序 if (isSorted) { break; } } } private static void swap(int[] array, int i, int j) { int temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void main(String[] args) { int[] array = {5, 2, 8, 9, 1, 3, 7}; bidirectionalBubbleSort(array); System.out.print("排序结果:"); for (int i : array) { System.out.print(i + " "); } } } ``` 以上示例代码通过`bidirectionalBubbleSort()`方法实现了双向冒泡排序算法,定义了两个指针`low`和`high`,分别表示从前往后和从后往前冒泡的起始位置。在每一轮的正向和反向冒泡中,如果发现相邻两个元素的顺序不符合要求,则进行交换。同时,通过设置`isSorted`变量判断是否已经完成排序,如果在一轮冒泡中没有发生交换,则说明数组已经有序,可以提前结束排序。 在主函数中,我们定义了一个待排序的整型数组,并调用`bidirectionalBubbleSort()`方法对数组进行排序。最后,输出排序完成后的数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值