冒泡排序

冒泡排序

img

步骤

比较相邻的两个元素,如果后一个元素比前一个元素大,那么就交换两个元素,把大的放在后面。

对每一对相邻元素都做比较,这样一趟下来,最大的元素就放在最后了。

除了最后有序的部分,对剩下的元素持续上述步骤,直到没有任何一对元素需要比较交换,排序结束。

还有一个优化点,就是如果这一趟下来,没有发生任何交换,那么说明数组已经有序了,没必要再对剩下元素再做比较了。因此可以设置一个flag,判断是否需要继续比较。

Java代码

public void sort(int[] arr) {
    if (null == arr || arr.length < 2) {
        return;
    }

    for (int j = 1; j < arr.length; j++) {
        boolean flag = true;
        for (int i = 0; i < arr.length - j; i++) { // 一趟冒泡,把最大的数放在最后
            if (arr[i] > arr[i + 1]) {
                this.exchange(arr, i, i + 1);
                flag = false;// 标识发生了交换
            }
        }
        if (flag) { // 全程无交换
            break;
        }
    }
}

优点

对于数组和链表,都可以用冒泡排序。因为冒泡排序是比较和交换相邻两个元素,这对链表和数组都是可行的。

冒泡排序是稳定的,也就是比较两个相邻元素相等,是不交换他们的位置的,两个元素的相对顺序不改变。

时间复杂度

最好O(n)

最差O(n^2)

原文地址:https://www.cnblogs.com/SimonZ/p/15517777.html