天天看點

《資料結構與算法之快速排序(Java實作)》前言01—算法思想02—具體實作代碼總結

說在前頭:本人為大二在讀學生,書寫文章的目的是為了對自己掌握的知識和技術進行一定的記錄,同時樂于與大家一起分享,因本人資曆尚淺,能力有限,文章難免存在一些錯漏之處,還請閱讀此文章的大牛們見諒與斧正。若在閱讀時有任何的問題,也可通過評論提出,本人将根據自身能力對問題進行一定的解答。

前言

快速排序(Quicksort)是對冒泡排序算法的一種改進,其算法的時間複雜度為O(Nlog2N),算法效率較高。但算法不夠穩定,當資料順序較為整齊時,效率将會降低,最壞的情況會達到O(N2)。

01—算法思想

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:設定一個基準的分界值(一般取最後一個或最後一個),通過一趟排序将要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分别進行快速排序,整個排序過程可以遞歸進行,以此達到整個資料變成有序序列。(下圖所示是第一輪排序的流程展示圖)

《資料結構與算法之快速排序(Java實作)》前言01—算法思想02—具體實作代碼總結

當基準點選用最左側的資料45時,45需要與最右側的資料進行對比,若最右側的資料小于45時,則該資料需要與45發生位置的互換,否則無需做任何操作,如上圖第一行的情況。

當基準點45經過位置的互換來到最右側時,此時需要與最左側未比較過的資料進行比較,若左側的資料大于45則需要與45發生位置的互換,否則無需做任何操作,如上圖第二行。

如此一直往複,直到基準點45的左側所有資料都小于45,右側都大于45時,該輪排序才結束(如上圖最後一行)。此時隻是一輪排序的結束,算法并未結束,因為45左右兩側的資料并未完成排序,我們還需要對左右兩側的數組再次進行快速排序,直到所有的資料都有序為止。

02—具體實作代碼

Fast.java

package com.bosen.fast;
​
/**
 * <p>快速排序</p>
 * @author Bosen 2021/5/29 22:26
 */
public class Fast {
    /*
     * 待排序的數組
     */
    private int[] array;
​
    private static int count = 0;
​
    public Fast(int[] array) {
        this.array = array;
    }
​
    /*
     * 執行排序
     */
    public void sort() {
        display("初始狀态:");
        recursiveSort(0, array.length-1);
    }
​
    /*
     * 使用遞歸的方式
     */
    public void recursiveSort(int low, int high) {
        if (low >= high) return;
        int tempLow = low;
        int tempHigh = high;
        int standard = array[low]; // 第一個元素為基準點
        while (low < high) {
            while (low < high && array[high] >= standard) {
                high--;
            }
            swap(low, high);
​
            while (low < high && array[low] <= standard) {
                low++;
            }
            swap(low, high);
        }
        display("第"+(++count)+"輪排序:");
        recursiveSort(tempLow, low-1);
        recursiveSort(low+1, tempHigh);
    }
​
    /*
     * 交換資料位置
     */
    public void swap(int low, int high) {
        int temp = array[high];
        array[high] = array[low];
        array[low] = temp;
    }
​
    /*
     * 列印排序情況
     */
    public void display(String msg) {
        System.out.print(msg);
        for (int i : array) {
            System.out.print("\t"+i);
        }
        System.out.println();
    }
}
           

Test.java

package com.bosen.fast;
​
public class Test {
    public static void main(String[] args) {
        int[] array = {45, 12, 23, 34, 78, 21, 98, 11};
        Fast fast = new Fast(array);
        fast.sort();
    }
}
           

輸出結果:

《資料結構與算法之快速排序(Java實作)》前言01—算法思想02—具體實作代碼總結

總結

此篇章節,主要介紹了快速排序算法的算法思想,并通過具體代碼來展現。在下一篇中,我們将來講述希爾排序算法,感興趣的小夥伴們可以先點個關注哦!

 👇掃描二維碼關注

《資料結構與算法之快速排序(Java實作)》前言01—算法思想02—具體實作代碼總結