冒泡排序、插入排序、選擇排序

冒泡排序、插入排序、選擇排序

冒泡排序(Bubble Sort)

冒泡排序只會操做相鄰的兩個數據。兩兩比較,將較大的數換到後邊。算法

代碼以下:數組

/**
     * 冒泡排序
     * 兩兩比較,將較大的數移到後邊。
     *
     * @param a
     * @param n
     */
    public void bubbleSort(int[] a, int n) {
        if (n <= 1) return;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n - i - 1; j++) {
                // 交換條件
                if (a[j] > a[j + 1]) {
                    int tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                }
            }
        }
    }
複製代碼

這裏咱們還能夠進行優化,若是某次冒泡以後已經沒有數據能夠交換時,說明已經達到徹底有序,不用再繼續執行後續的冒泡操做。代碼以下:bash

/**
     * 優化後的冒泡排序
     *
     * @param a
     * @param n
     */
    public void bubbleSortOptimize(int[] a, int n) {
        if (n <= 1) return;
        for (int i = 0; i < n; i++) {
            // 提早退出冒泡循環的標誌位
            boolean flag = false;
            for (int j = 0; j < n - i - 1; j++) {
                if (a[j] > a[j + 1]) {
                    int tmp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = tmp;
                    flag = true;
                }
            }
            // 沒有數據交換,提早退出
            if (!flag) break;
        }
    }
複製代碼

插入排序(Insertion Sort)

咱們將待排序的數據分爲兩個區間,已排序區間和未排序區間。初始狀態下,已排序區間爲空。優化

插入算法的核心思想是取未排序區間的元素,在已排序區間中找到合適的位置插入,並保證已排序區間數據一直有序。重複這個過程,直到未排序區間中元素爲空,算法結束。ui

代碼以下:spa

/**
     * 插入排序
     * 將數據插入到有序數組中。
     *
     * @param a
     * @param n
     */
    public void insertSort(int[] a, int n) {
        if (n <= 1) return;

        for (int i = 1; i < n; i++) {
            int value = a[i];
            int j = i - 1;
            // 查找插入的位置
            for (; j >= 0; j--) {
                if (a[j] > value) {
                    a[j + 1] = a[j];// 數據移動
                } else {
                    break;
                }
            }
            a[j + 1] = value;// 插入數據
        }
    }
複製代碼

選擇排序(Selection Sort)

跟插入排序相似,選擇排序也區分已排序區間和未排序區間。初始狀態下,已排序區間爲空。 選擇排序的核心是每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。code

代碼以下:排序

/**
     * 插入排序
     * 從未排序區間中找到最小元素,將其放到已排序區間的末尾。
     *
     * @param a
     * @param n
     */
    public void selectSort(int[] a, int n) {
        if (n <= 1) return;
        for (int i = 0; i < n - 1; i++) {
            // 查找最小值的角標
            int minIndex = i;
            for (int j = i + 1; j < n; j++) {
                if (a[j] < a[minIndex]) {
                    minIndex = j;
                }
            }

            // 減小無用的交換。
            if (minIndex == i) {
                continue;
            }

            // 交換
            int tmp = a[i];
            a[i] = a[minIndex];
            a[minIndex] = tmp;
        }
    }
複製代碼
相關文章
相關標籤/搜索