中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么深入了解Java數據結構中常見的排序算法

發布時間:2022-02-04 18:15:10 來源:億速云 閱讀:139 作者:柒染 欄目:開發技術

本篇文章給大家分享的是有關怎么深入了解Java數據結構中常見的排序算法,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一,概念

1,排序

排序,就是使一串記錄,按照其中的某個或某些關鍵字的大小,遞增或遞減的排列起來的操作。 平時的上下文中,如果提到排序,通常指的是排升序(非降序)。 通常意義上的排序,都是指的原地排序(in place sort)。

2,穩定性

兩個相等的數據,如果經過排序后,排序算法能保證其相對位置不發生變化,則我們稱該算法是具備穩定性的排序算法。

怎么深入了解Java數據結構中常見的排序算法

或者我們說沒有跳躍的排序也是穩定的排序

怎么深入了解Java數據結構中常見的排序算法

二,排序詳解

怎么深入了解Java數據結構中常見的排序算法

1,插入排序

①直接插入排序

整個區間被分為

               1. 有序區間

               2. 無序區間

每次選擇無序區間的第一個元素,在有序區間內選擇合適的位置插入

怎么深入了解Java數據結構中常見的排序算法

 public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
        insertSort(array);
        System.out.println(Arrays.toString(array));
    }
  /**
     * 時間復雜度:
     *        最好:O(N)   -> 數據是有序的
     *        最壞:O(N^2) -> 無序的數據
     * 空間復雜度:O(1)
     * 穩定性:穩定排序
     * @param array
     */
public static void insertSort(int[] array) {
        for(int i = 1;i < array.length;i++) {//n-1
            int tmp = array[i];
            int j = i-1;
            for(; j >= 0;j--) {//n-1
                if(array[j] > tmp) {
                    array[j+1] = array[j];
                }else{
                    //array[j+1] = tmp;
                    break;
                }
            }
            array[j+1] = tmp;
        }
    }

怎么深入了解Java數據結構中常見的排序算法

②希爾排序

希爾排序法又稱縮小增量法。希爾排序法的基本思想是:先選定一個整數,把待排序文件中所有記錄分成個組,所有 距離為的記錄分在同一組內,并對每一組內的記錄進行排序。然后,取,重復上述分組和排序的工作。當到達=1時, 所有記錄在統一組內排好序。

1. 希爾排序是對直接插入排序的優化。

2. 當gap > 1時都是預排序,目的是讓數組更接近于有序。當gap == 1時,數組已經接近有序的了,這樣就會很 快。這樣整體而言,可以達到優化的效果。我們實現后可以進行性能測試的對比。

怎么深入了解Java數據結構中常見的排序算法

怎么深入了解Java數據結構中常見的排序算法

   /**
     * 時間復雜度:不好算  n^1.3 - n^1.5 之間
     * 空間復雜度:O(1)
     * 穩定性:不穩定的排序
     *      技巧:如果在比較的過程當中 沒有發生跳躍式的交換 那么就是穩定的
     * @param array
     *
     *
     * @param array 排序的數組
     * @param gap   每組的間隔  -》 組數
     */
    public static void shell(int[] array,int gap) {
        for (int i = gap; i < array.length; i++) {
            int tmp = array[i];
            int j = i-gap;
            for (; j >= 0; j -= gap) {
                if(array[j] > tmp) {
                    array[j+gap] = array[j];
                }else {
                    break;
                }
            }
            array[j+gap] = tmp;
        }
    }
public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
        shell(array,5);
        System.out.println(Arrays.toString(array));
    }

怎么深入了解Java數據結構中常見的排序算法

2,選擇排序

①直接選擇排序

每一次從無序區間選出最大(或最小)的一個元素,存放在無序區間的最后(或最前),直到全部待排序的數據元素排完 。

怎么深入了解Java數據結構中常見的排序算法

public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
        selectSort(array);
        System.out.println(Arrays.toString(array));
    }
  /**
     * 時間復雜度:
     *      最好:O(N^2)
     *      最壞:O(N^2)
     * 空間復雜度:O(1)
     * 穩定性:不穩定的
     * @param array
     */
    public static void selectSort(int[] array) {
        for (int i = 0; i < array.length; i++) {
            for (int j = i+1; j < array.length; j++) {
                if(array[j] < array[i]) {
                    int tmp = array[i];
                    array[i] = array[j];
                    array[j] = tmp;
                }
            }
        }
    }

怎么深入了解Java數據結構中常見的排序算法

②堆排序

基本原理也是選擇排序,只是不在使用遍歷的方式查找無序區間的最大的數,而是通過堆來選擇無序區間的最大的數。

注意: 排升序要建大堆;排降序要建小堆。

怎么深入了解Java數據結構中常見的排序算法

  public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
        heapSort(array);
        System.out.println(Arrays.toString(array));
    }
   public static void siftDown(int[] array,int root,int len) {
        int parent = root;
        int child = 2*parent+1;
        while (child < len) {
            if(child+1 < len && array[child] < array[child+1]) {
                child++;
            }
            //child的下標就是左右孩子的最大值下標
            if(array[child] > array[parent]) {
                int tmp = array[child];
                array[child] = array[parent];
                array[parent] = tmp;
                parent = child;
                child = 2*parent+1;
            }else {
                break;
            }
        }
    }
 
    public static void createHeap(int[] array) {
        //從小到大排序 -》 大根堆
        for (int i = (array.length-1 - 1) / 2;  i >= 0 ; i--) {
            siftDown(array,i,array.length);
        }
    }
 
    /**
     * 時間復雜度:O(N*logN)  都是這個時間復雜度
     * 復雜度:O(1)
     * 穩定性:不穩定的排序
     * @param array
     */
    public static void heapSort(int[] array) {
        createHeap(array);//O(n)
        int end = array.length-1;
        while (end > 0) {//O(N*logN)
            int tmp = array[end];
            array[end] = array[0];
            array[0] = tmp;
            siftDown(array,0,end);
            end--;
        }
    }

怎么深入了解Java數據結構中常見的排序算法

3,交換排序

①冒泡排序

在無序區間,通過相鄰數的比較,將最大的數冒泡到無序區間的最后,持續這個過程,直到數組整體有序

怎么深入了解Java數據結構中常見的排序算法

 public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
         bubbleSort(array);
        System.out.println(Arrays.toString(array));
    }
   /**
     * 時間復雜度:
     *         最好最壞都是O(n^2) 
     * 空間復雜度:O(1)
     * 穩定性:穩定的排序
     *      冒泡  直接插入
     * @param array
     */
    public static void bubbleSort(int[] array) {
        for (int i = 0; i < array.length-1; i++) {
            for (int j = 0; j < array.length-1-i; j++) {
                if(array[j] > array[j+1]) {
                    int tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
 
                }
            }
        }
    }

怎么深入了解Java數據結構中常見的排序算法

②快速排序

1. 從待排序區間選擇一個數,作為基準值(pivot);

2. Partition: 遍歷整個待排序區間,將比基準值小的(可以包含相等的)放到基準值的左邊,將比基準值大的(可 以包含相等的)放到基準值的右邊;

3. 采用分治思想,對左右兩個小區間按照同樣的方式處理,直到小區間的長度 == 1,代表已經有序,或者小區間 的長度 == 0,代表沒有數據。

怎么深入了解Java數據結構中常見的排序算法

public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
        quickSort1(array);
        System.out.println(Arrays.toString(array));
    }
public static int partition(int[] array,int low,int high) {
        int tmp = array[low];
        while (low < high) {
            while (low < high && array[high] >= tmp) {
                high--;
            }
            array[low] = array[high];
            while (low < high && array[low] <= tmp) {
                low++;
            }
            array[high] = array[low];
        }
        array[low] = tmp;
        return low;
    }
 public static void quick(int[] array,int start,int end) {
        if(start >= end) {
            return;
        }
        int mid = (start+end)/2;
        int pivot = partition(array,start,end);
        quick(array,start,pivot-1);
        quick(array,pivot+1,end);
    }
 
    /**
     * 時間復雜度:
     *         最好:O(n*logn)  均勻的分割下
     *         最壞:o(n^2)     數據有序的時候
     * 空間復雜度:
     *        最好:logn
     *        最壞:O(n)
     * 穩定性:不穩定的排序
     *
     * k*n*logn
     * 2
     * 1.2
     * @param array
     */
    public static void quickSort1(int[] array) {
        quick(array,0,array.length-1);
    }

怎么深入了解Java數據結構中常見的排序算法

4,歸并排序

歸并排序(MERGE-SORT)是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子 序列段間有序。若將兩個有序表合并成一個有序表,稱為二路歸并。

怎么深入了解Java數據結構中常見的排序算法

 public static void main(String[] args) {
 
        int[] array = {12,5,9,34,6,8,33,56,89,0,7,4,22,55,77};
        mergeSort1(array);
        System.out.println(Arrays.toString(array));
    }
public static void merge(int[] array,int low,int mid,int high) {
        int s1 = low;
        int e1 = mid;
        int s2 = mid+1;
        int e2 = high;
        int[] tmp = new int[high-low+1];
        int k = 0;//代表tmp數組的下標
        while (s1 <= e1 && s2 <= e2) {
            if(array[s1] <= array[s2]) {
                tmp[k++] = array[s1++];
            }else {
                tmp[k++] = array[s2++];
            }
        }
 
        //有2種情況
        while (s1 <= e1){
            //說明第2個歸并段沒有了數據 把第1個歸并段剩下的數據 全部拷貝過來
            tmp[k++] = array[s1++];
        }
 
        while (s2 <= e2) {
            //說明第1個歸并段沒有了數據 把第2個歸并段剩下的數據 全部拷貝過來
            tmp[k++] = array[s2++];
        }
        //tmp數組當中 存儲的就是當前歸并好的數據
 
        for (int i = 0; i < tmp.length; i++) {
            array[i+low] = tmp[i];
        }
    }
    public static void mergeSortInternal(int[] array,int low,int high) {
        if(low >= high) {
            return;
        }
        int mid = (low+high) / 2;
        mergeSortInternal(array,low,mid);
        mergeSortInternal(array,mid+1,high);
        //合并的過程
        merge(array,low,mid,high);
    }
 
    /**
     * 時間復雜度: O(N*log n)
     * 空間復雜度:O(N)
     * 穩定性:穩定的
     * @param array
     */
    public static void mergeSort1(int[] array) {
        mergeSortInternal(array, 0,array.length-1);
    }

怎么深入了解Java數據結構中常見的排序算法

以上就是怎么深入了解Java數據結構中常見的排序算法,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

读书| 绥阳县| 红安县| 砀山县| 松阳县| 绥化市| 馆陶县| 韶关市| 无为县| 江安县| 靖宇县| 东源县| 类乌齐县| 辽阳市| 娄底市| 富民县| 吉林市| 泰和县| 罗平县| 盐津县| 波密县| 腾冲县| 达日县| 合川市| 冷水江市| 连江县| 洞头县| 瑞安市| 二连浩特市| 灵璧县| 碌曲县| 临泉县| 镇沅| 宁强县| 临武县| 太康县| 尚志市| 承德市| 岗巴县| 横峰县| 彭阳县|