排序

排序

849589-20190306165258970-1789860540.png
849589-20180402133438219-1946132192.png

1. 冒泡排序

相鄰的元素 比較和交換把曉得數(shù)字交換到最前面
例如:對(duì)5,3,8,6,4這個(gè)無序序列進(jìn)行冒泡排序。首先從后向前冒泡,4和6比較,把4交換到前面,序列變成5,3,8,4,6。同理4和8交換,變成5,3,4,8,6,3和4無需交換。5和3交換,變成3,5,4,8,6這樣一次冒泡就完了,把最小的數(shù)3排到最前面了。對(duì)剩下的序列依次冒泡就會(huì)得到一個(gè)有序序列。冒泡排序的時(shí)間復(fù)雜度為O(n^2)。

image.png

code:

    public static int[] doIt(int[] arr){
        int len = arr.length;
        int temp;
        for (int i = 0; i < len-1; i++) {
            for (int j = 0;j<len-i-1;j++){
                if (arr[j]>arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }

2. 選擇排序

從第一個(gè)位置開始選擇,選中第一個(gè)位置,依次對(duì)比,將最小的數(shù)字挪到這個(gè)位置。第二次選擇從第二個(gè)位置開始選,重復(fù)操作
選擇排序的時(shí)間復(fù)雜度為O(n^2)


image.png

code:

    public static int[] doIt(int[] arr){
        int len = arr.length;
        int min;
        int temp;

        for (int i = 0; i < len-1; i++) {
            min = i;
            for (int j = i+1; j < len; j++){
                if (arr[j]<arr[min]){
                    min = j;
                }
            }
            if (min!=i){
                temp = arr[min];
                arr[min] = arr[i];
                arr[i] = temp;
            }
        }
        return arr;
    }

3. 插入排序

  • 默認(rèn)第一個(gè)為正確的排序
  • 從第二個(gè)開始操作
  • 第二個(gè)往前對(duì)比,如果比前一個(gè)小那么就將前一個(gè)往后移動(dòng)一位
  • 第三也是重復(fù)操作
    簡單插入排序的時(shí)間復(fù)雜度也是O(n^2)
    image.png

code:

    public static int[] doIt(int[] arr){
        int len = arr.length;
        int temp;
        int j;

        for (int i = 1; i < len; i++) {
            j = i;
            temp = arr[i];
            while (j>0&&arr[j-1]>temp){
                arr[j] = arr[j-1];
                j--;
            }
            arr[j] = temp;
        }
        return arr;
    }

4. 快速排序

image.png

code:

public static void quickSort(int[] arr,int low,int hight){
        int i = low;
        int j = hight;
        if (low>=hight){
            return;
        }
        int mid = arr[low];
        while (low<hight){
            while (low<hight && arr[hight] >= mid){
                hight--;
            }
            if (low<hight){
                arr[low] = arr[hight];
                low++;
            }

            while (low<hight && arr[low] < mid){
                low++;
            }

            if (low<hight){
                arr[hight] = arr[low];
                hight--;
            }
        }

        arr[low] = mid;
        //做前面的
        quickSort(arr, i,low-1);

        //做后面的
        quickSort(arr,low+1,j);
    }

    public static int[] doIt(int[] arr){
        int len = arr.length-1;
        quickSort(arr,0, len);
        return arr;
    }

5. 堆排序

堆的性質(zhì):所有的節(jié)點(diǎn)都不大于它的子節(jié)點(diǎn)。
組成堆可以從最后一個(gè)非葉子節(jié)點(diǎn)開始。
輸出:輸出堆頂,然后將最后一個(gè)元素提拔上來,進(jìn)行落底操作

code:

public class HeapSort {
    public static void main(String[] args){
        Arr arr = new Arr();
        System.out.println("堆排序前"+arr.toString());

        doIt(arr.getArr());

    }


    public static void heapOne(int[] arr, int length, int k){
        int k1 = 2*k+1;
        int k2 = 2*k+2;
        //是否為葉子
        if (k1>=length && k2>=length){
            return;
        }

        int a1 = Integer.MAX_VALUE;
        int a2 = Integer.MAX_VALUE;

        //左孩子
        if (k1<length){
            a1 = arr[k1];
        }
        //右孩子
        if (k2<length){
            a2 = arr[k2];
        }

        //符合要求了
        if(arr[k]<=a1 && arr[k]<=a2){
            return;
        }

        if (a1<a2){
            int t = arr[k];
            arr[k] = arr[k1];
            arr[k1] = t;
            heapOne(arr, length, k1);
        }else{
            int t = arr[k];
            arr[k] = arr[k2];
            arr[k2] = t;
            heapOne(arr, length, k2);
        }

    }


    public static void doIt(int[] arr){
        for (int i = arr.length - 1 / 2; i >= 0; i--) {
            heapOne(arr,arr.length,i);
        }
        int len = arr.length;
        while (len>0){
            System.out.print(arr[0]+"  ");
            arr[0] = arr[len-1];
            len--;
            heapOne(arr,len, 0);
        }
    }
}

6. 希爾排序

7. 歸并排序

image

code:

public class MergeSort {
    public static void main(String[] args) {
        Arr arr = new Arr();
        System.out.println("歸并排序前" + arr.toString());

        doIt(arr.getArr(), 0, arr.getArr().length - 1);

        System.out.println("歸并排序后" + arr.toString());
    }


    public static void doIt(int[] arr, int low, int high) {
        int mid = (low + high) / 2;
        if (low < high) {
            doIt(arr, low, mid);
            doIt(arr, mid + 1, high);
            merge(arr, low, mid, high);
        }
    }

    private static void merge(int[] arr, int low, int mid, int high) {
        int[] temp = new int[high - low + 1];

        int ai = low;
        int bi = mid + 1;
        int xi = 0;

        while (ai <= mid && bi <= high) {
            if (arr[ai] < arr[bi]) {
                temp[xi++] = arr[ai++];
            } else {
                temp[xi++] = arr[bi++];
            }
        }

        while (ai <= mid) {
            temp[xi++] = arr[ai++];
        }

        while (bi <= high) {
            temp[xi++] = arr[bi++];
        }

        for (int i=0;i<temp.length;i++){
            arr[low+i] = temp[i];
        }

    }
}

8. 計(jì)數(shù)排序

9. 桶排序

10. 基數(shù)排序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 排序的基本概念 在計(jì)算機(jī)程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個(gè)關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,571評(píng)論 1 4
  • 排序(上):為什么插入排序比冒泡排序更受歡迎? 排序?qū)τ谌魏我粋€(gè)程序員來說,可能都不會(huì)陌生。你學(xué)的第一個(gè)算法,可能...
    GhostintheCode閱讀 3,438評(píng)論 4 27
  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,301評(píng)論 0 52
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個(gè)記錄插入到已排序好...
    依依玖玥閱讀 1,352評(píng)論 0 2
  • 當(dāng)我再次站在這個(gè)闊別十六年的城市邊緣的時(shí)候,心情卻是那么的平靜!往事一幕幕浮現(xiàn)在眼前。這是我出生的地方,在這...
    水的樂維奇閱讀 266評(píng)論 0 0

友情鏈接更多精彩內(nèi)容