Java实现冒泡排序

12 篇文章 0 订阅
11 篇文章 0 订阅

冒泡排序:如果该元素大于右侧相邻元素,则进行位置交换;否则保持位置不变;

实现代码:

import java.util.Arrays;

public class BubbleSortDemo {

    /**
     * 冒泡排序:如果该元素大于右侧相邻元素,则交换,否则不变;
     *
     * 优化:如果发现后面几次都没有交换位置,则不用循环比较;所以增加一个标志来判断是否产生来交换,如果没有则后面不循环比较
     * @param arr
     */
    public static void sort(int[] arr) {
        int cnt = 0;
        boolean hasChanged = true;
        for (int i = 0; i < arr.length && hasChanged; i++) {
            hasChanged = false;
            for (int j = 0; j < arr.length - i -1 ; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j + 1] = tmp;
                    hasChanged = true;
                }
                cnt++;
            }
        }
        System.out.println("Loop times:" + cnt);
    }

    public static void main(String[] args) {
       // int[] arr = new int[]{54, 12, 3, 88, 10, 2, 100, 8};
        int[] arr = new int[]{3, 2, 10, 18, 12, 54, 88, 100};
        sort(arr);
        System.out.println(Arrays.toString(arr));
        arr = new int[]{54, 12, 3, 88, 10, 2, 100, 8};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }
}

运行结果:

Loop times:13
[2, 3, 10, 12, 18, 54, 88, 100]
Loop times:27
[2, 3, 8, 10, 12, 54, 88, 100]

冒泡排序的一种优化方式:

/**
     * 冒泡排序:如果该元素大于右侧相邻元素,则交换,否则不变;
     *
     * 优化:如果发现后面几次都没有交换位置,则不用循环比较;所以增加一个标志来判断是否产生来交换,如果没有则后面不循环比较
     * @param arr
     */
    public static void sort(int[] arr) {
        int cnt = 0;
        boolean hasChanged = true;
        int lastSort = arr.length-1;
        int sortBorder = lastSort;
        for (int i = 0; i < arr.length && hasChanged; i++) {
            hasChanged = false;
            for (int j = 0; j < sortBorder; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j + 1] = tmp;
                    lastSort = j;
                    hasChanged = true;
                }
                cnt++;
            }
            sortBorder = lastSort;
        }
        System.out.println("Loop times:" + cnt);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值