快速排序:随便找一个目标值 ,放在数组的某个下标 ,使得该下标左侧度小于目标值 ,下标右侧大于目标值.
接下来 为 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]);
}
}
}