4.排序(上)

點擊使用幕布網頁版查看(含思惟導圖)算法

有序度:數組中具備有序關係的元素對的個數數組

有序元素對:a[i] <= a[j],若是i < j。

徹底有序的數組,有序度就是 n * (n - 1) /2(滿有序度)

逆序度 = 滿有序度 - 有序度
  • 冒泡排序
    • 特性url

      • 原地
      • 穩定
      • O(n**2)(最少0次交換,最多n*(n-1)/2次交換)
    • 冒泡排序每次比較相鄰兩數,若爲逆序則交換,因此冒泡排序交換次數老是肯定的,即爲逆序度。.net

  • 插入排序code

    • 特性排序

      • 原地
      • 穩定
      • O(n**2)(將一個數據插入數組(O(n)),重複n次)
    • 插入排序將數組分爲兩個區間:已排序區間和未排序區間。初始已排序區間只有一個元素,就是數組首元素。每次取未排序區間元素在已排序區間中找到合適的位置插入,直到未排序區間爲空。插入排序移動操做的次數是固定的,等於逆序度。get

  • 兩種排序算法比較io

    • 雖然兩種排序算法相同,都是原地、穩定排序,但插入排序要比冒泡排序更優思維導圖

    • 冒泡排序交換次數和插入排序數據移動次數同樣,都等於逆序度class

    • 冒泡排序數據交換須要3個賦值操做,而插入排序數據移動只須要1個。

冒泡排序和插入排序Java實現

public class Sort {
    /**
     * 冒泡排序
     *
     * @param arr
     * @param n
     */
    public static void bubbleSort(int arr[], int n) {
        if (n <= 1) return;
        int count = 0;
        //最多進行n - 1次冒泡
        for (int i = 0; i < n; i++) {
            boolean swaped = false;
            for (int j = 0; j < n - i - 1; j++) {
                //每次比較相鄰數 把較大的放在後面
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                    swaped = true;
                }
            }
            count++;
            if (!swaped) break;
        }
        System.out.println("進行了" + count + "次冒泡");
    }

    /**
     * 插入排序
     *
     * @param arr
     * @param n
     */
    public static void inserctionSort(int arr[], int n) {
        if (n <= 1) return;
        //將數組分爲已排序部分和未排序部分
        for(int i = 1; i < n; i++) {
            int value = arr[i];//未排序部分的第一個值
            int j = i - 1;
            //每次將未排序部分的第一個值插入已排序部分中
            for(; j >= 0; j--){
                //尋找插入點 arr[j]爲第一個小於等於value的值
                if(arr[j] > value)
                    arr[j + 1] = arr[j];
                else
                    break;
            }
            //將value插入到j後面
            arr[j + 1] = value;
        }
    }

    public static void sortTest() {
        int arr[] = {3, 5, 4, 1, 2, 6};
        printArr(arr);
        inserctionSort(arr, arr.length);
        printArr(arr);
    }

    public static void printArr(int arr[]) {
        for (int i : arr) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
相關文章
相關標籤/搜索