快速排序:隨便找一個目標值 ,放在數組的某個下標 ,使得該下標左側度小於目標值 ,下標右側大於目標值.
接下來 爲 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]);
}
}
}