算法------冒泡排序算法优化

代码地址:https://github.com/luoweian/optimalSortingAlgorithm/

通用代码,交换两个数的位置

    public static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

(1)基础算法,从左到右一直交换,每次排好左右边的一个数,无论数据状况如何时间复杂度都是O(N平方);

    public static void bubbleSort1(int[] arr) {
        for (int end = arr.length - 1; end > 0; end--) {
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                }
            }
        }
    }

(2)设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,

说明排序已经完成。数据是有序的时候,时间复杂度是O(N);

    public static void bubbleSort2(int[] arr) {
        boolean flag = true;
        int end = arr.length;
        while (flag) {
            flag = false;
            for (int i = 0; i < end - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                    flag = true;
                }
            }
            end--;
        }
    }

(3)再进一步做优化。比如,现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。如果是对于上面的冒泡排序算法2来说,虽然也只排序100次,但是前面的100次排序每次都要对后面的900个数据进行比较,而对于现在的排序算法3,只需要有一次比较后面的900个数据,之后就会设置尾边界,保证后面的900个数据不再被排序。

    public static void bubbleSort3(int[] arr){
        boolean flag = true;
        int end = arr.length;
        int record = 0;
        while (flag) {
            flag = false;
            for (int i = 0; i < end - 1; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                    flag = true;
                    record = i;
                }
            }
            end = record;
        }
    }

猜你喜欢

转载自blog.csdn.net/weianluo/article/details/80834108
今日推荐