冒泡排序(三种实现两种优化)

排序思想: 相邻两元素进行比较,如有需要则进行交换,每完成一次循环就将最大元素排在最后(如从小到大排序),下一次循环是将其它的数进行类似操作。

初级版

public static void bubbleSort(int[] arr) {
        int swap;
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = arr.length-1; j > i; j--) {
                if (arr[j-1] > arr[j]) {
                    swap = arr[j-1];
                    arr[j-1] = arr[j];
                    arr[j] = swap;
                }
            }
        }
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

改进版1:设置一个标志性变量pos,用于记录每趟排序中最后一次进行交换的位置,由于pos位置之后的记录均已交换到位,故在进行下一趟排序是只要扫描到pos位置即可。

public static void bubbleSort(int[] arr) {
        int swap;
        int pos=0;//记录本次循环,最后交换的位置
        int k = arr.length -1;
        for (int i = 0; i < arr.length -1; i++) {
            for (int j = 0;j < k ; j++) {
                if (arr[j] > arr[j+1]) {
                    swap = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = swap;
                    pos = j + 1;
                }
            }
            k = pos;
        }
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

改进版2:如果数组已经有序,则直接返回。加一个flag

public static void bubbleSort(int[] arr) {
        int swap;
        int pos=0;//记录本次循环,最后交换的位置
        int k = arr.length -1;
        int flag = 1;//假设已经有序
        for (int i = 0; i < arr.length -1; i++) {
            for (int j = 0;j < k ; j++) {
                if (arr[j] > arr[j+1]) {
                    swap = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = swap;
                    pos = j + 1;
                    flag = 0;
                }
            }
            k = pos;
            if(flag == 1){// 如果本趟走完没有交换,则有序
                break;
            }
        }
        //打印数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
原文地址:https://www.cnblogs.com/xingrui/p/9689513.html