《排序算法》系列 -淺顯易懂的認識---快速排序

前言

這幾天的學習排序算法,我想對我最大的改變就是對於思維的改變,改變了遇到問題就for循環,不行就再繼續套循環。。。。。
解決問題的思維不能死,可以另闢思維去想,當把一種排序算法的邏輯理清楚,會驚歎這種想法,原來可以這樣去解決問題,我想這是對於思維的最大開闊。
在這裏插入圖片描述

今天上的是快速排序,而且經過自己的學習發覺排序中好多都用到了遞歸的思想,通過遞歸來解決好多問題,這也是自己以後在項目中需要加強的。

好了,廢話不多說,上代碼!
在這裏插入圖片描述

import java.util.Arrays;

/**
 * @author Administrator
 *
 * 快速排序中,需要介入分區點
 * 通過分區點將數組分爲三部分,第一部分是小於分區點的值,第二部分是分區點的值,第三部分是大於分區點的值
 * 然後通過遞歸的思想將第一分區和第三分區再進行通過分區點來分區,直到分到的值的長度都爲1
 * 此時將這些值連接起來就是快速排序的結果
 *
 *
 * 1、從數組中找到一個分區點
 * 2、重新排序數組,所有元素和分區點元素進行比較
 *  如果比分區點小,則放在分區點左邊
 *  如果比分區點大,則放在分區點右邊
 *  3、對左邊和右邊的數組進行遞歸的排序
 *
 *
 *
 *  快速排序中,找到默認的分區點爲數組的最後一個元素
 *  然後定義一個分區點的下標,默認爲begin
 *  然後將分區點的元素與數組的其它元素進行比較,然後交換位置
 *  最後得到   (小於分區點的元素)、分區點、(大於分區點的元素)
 *  最後返回分區點的下標
 */
public class quickSort {

    /**
     * 快速排序方法
     * 通過遞歸和分區的思想實現
     *
     * 將傳入的數組通過返回分區點的方法,返回對應的分區點下標
     * 然後通過該下標將數組進行分區,分爲左側和右側
     * 對左側和右側的數組再進行尋找分區點進行分區(使用遞歸的方法)
     * 最後數組的長度爲1不可分時,則遞歸終止
     *
     *
     * @param array
     * @param begin
     * @param end
     */
    public void quickSort(int[] array,int begin,int end){
        //校驗。遞歸的終止條件
        if (array.length<2||begin>=end){
            return;
        }
        //進行分區,得到分區的下標
        int pivotIndex = partition(array,begin,end);


        //對左側的數組進行快速排序
        quickSort(array,begin,pivotIndex-1);

        //對右側的數組進行快速排序
        quickSort(array,pivotIndex,end);

    }


    /**
     * 返回分區點方法
     *
     *
     * 快速排序中,找到默認的分區點爲數組的最後一個元素
     * 然後定義一個分區點的下標,默認爲begin
     * 然後將分區點的元素與數組的其它元素進行比較,然後交換位置
     * 最後得到   (小於分區點的元素)、分區點、(大於分區點的元素)
     * 最後返回分區點的下標
     * @param array
     * @param begin
     * @param end
     * @return
     */
    public int partition(int[] array,int begin,int end){
        //設定一個默認分區點爲默認數組的最後一個元素
        int pivot = array[end];
        //設定分區點的下標
        int partition = begin;
        //執行for循環將傳進來的數組通過分區點進行分區
        for (int i = begin; i < end; i++) {
            //判斷該區間有小於pivot的元素,則將該元素從區間頭一直向後填充
            if (pivot>array[i]){
                if (i>partition){
                    //數據元素進行交換
                    swap(array,i,partition);
                }
                partition++;
            }
        }
        swap(array,partition,end);
        return partition;
    }

    /**
     * 交換方法
     * @param array
     * @param i
     * @param j
     */
    public void swap(int[] array,int i,int j){
        int temp = array[j];
        array[j] = array[i];
        array[i] = temp;
    }


    public static void main(String[] args) {
        quickSort mergeSort = new quickSort();
        int[] arr = new int[5];
        arr[0]=5;
        arr[1]=2;
        arr[2]=6;
        arr[3]=9;
        arr[4]=0;
        System.out.println(Arrays.toString(arr));
        mergeSort.quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}

具體的邏輯我也不重複說了,代碼中寫了自己對於快速排序的邏輯,希望能有幫助,另外希望在對於有問題的地方,能給予提出,畢竟自己的理解可能會有偏差!多謝!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章