1 .算法基礎 快速排序

快速排序:隨便找一個目標值 ,放在數組的某個下標 ,使得該下標左側度小於目標值 ,下標右側大於目標值.

 

 

接下來  爲 1  4  5  2  6  7  8  

分析 : 6爲目標值 6的左邊 是 1  4  5  2 符合概念 ,左側都是小於目標值的 ,右側 7 8 符合 右側大於目標值 ,現在講 6 左側 ,和右側 ,看成兩個新的數組 .

    第一個數組 1  4  5  2

    第二個數組  7  8

 

排序第一個 

   1.找到目標值 以第一個爲例 目標值爲 1 定義 i 和 j  ,i=下標0 ,j =數組長度,也就是數值爲2的下標

   2. 此時判斷 第一個數組 是否滿足條件 目標值右側 是大於目標值的嗎 , 向 1 4 5 2 符合條件 ,所以分成新的數組 4  5  2 ,進行排序.

   3.     4  5  2 ,   目標值是4,從j開始向前走 , j找比 目標值4小的數 ,走到了 頭 ,沒有相遇了 i 交換位置   ,2 4 5 條件符合  ,

        左側 爲 1  2   4   5  

第二個數組 :7  8  符合 條件 

排序完成 

1   2  4   5  6  7  8

總結 :思路不是特別清晰 ,總體來說 ,選擇一個目標值 ,使其左側都是小於 目標值的 ,右側 都是大於目標值的 , 左側第一個爲目標值 ,要從 右側第一個 開始 走 , 當右側找到 小於目標值的數 停在那裏 ,然後左側 走 ,當左側 走到大於小於目標值的 數 停住 ,兩個數 互換位置 ,(前提是兩個數 不相遇) ,相遇即代表 一次排序完成 ,表示 目標值左側都是小於它的 ,右側都是大於它的 ,將目標值 左側和右側 分爲兩個數組 ,在從第一個步驟開始開 ,依次循環.

 

 

附上 java代碼:

package com.ivying;

import android.util.Log;

/**
 * author : Majunbao
 * github : https://github.com/MaJunBaox
 * time   : 2019/9/20 13:47
 * desc   : 算法 基礎 快速排序
 */
public class Demo {

    /**
     * 方法
     * @param array 數組
     * @param left 數組最左邊下標
     * @param right 數組最右邊下標
     */
    public static  void quickSort (int[] array , int left ,int right){
        //防止下標越界
        if (left >= right) {
            return;
        }

        /**
         * 1.定義基準數 (默認基準數爲數組下標爲0的數)
                * 2.找到最左邊第一個 i
         * 3.找到最右邊 j
         * 4.用於交換的臨時變量
                */

        int base = array[left];
        int i = left;
        int j = right;
        int temp;

        while (i != j){
            while (array[j] >= base && i < j) {
                j--;
            }

            while (array[i] <= base && i<j) {
                i++;
            }

            if (i < j) {
                temp = array[i];
                array[i] = array[j];
                array[j] =temp;
            }
        }

        array[left] =array[i];
        array[i] = base;


        quickSort(array ,left , i-1);
        quickSort(array , i+1 , right);

        for (int z = 0; z < array.length; z++) {
            Log.d("liuyi",   "排序後:"+array[z]);
        }
    }
}

 

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