快速排序:
总的来说就是先找一个基数(一般以low作为基准数) 把比基准数大的放在基准数的右边比基数小的放在左边然后再对其左右进行排序
栗子:
以数组arr[] = { 2, 3, 8, 7, 1} 为栗子
首先要有两个指针 low 和high 以及基准数 在此以arr[low]作为基准数把比它大的放在它右边比它小的数放在它左边 temp 保存一下基准数的值 因为排序过程中它的值会被覆盖
temp =arr[low] =2 | ||||
low | high | |||
2 | 3 | 8 | 7 | 1 |
然后先让 high指针左移 如果大于等于基准数则 high-- 否则放在基准数前边
temp =arr[low] =2 | ||||
low | ←high | |||
2 | 3 | 8 | 7 | 1 |
也就是赋值给low所在位置 arr[low] = arr[high]
为什么要这么赋值?
因为 low 此时就相当于基准数的前边 high此时就相当于基准数的右边 移动low和high 当满足一定条件时就是基准数要放的位置
用high low 就是在找基准数要放的位置顺便把比他小的放前边比他大的放后边 你在纸上用笔想怎么移动就怎么移动但是数组是写死了需要你自己灵活的调整每个元素的位置 模拟移动这个过程最终实现的效果就是 (比他小的放前边比他大的放后边)
temp =arr[low] =2 | ||||
low | high | |||
1 | 3 | 8 | 7 | 1 |
low位置值被修改了开始移动 low 让low指针右移 如果小于等于基准数则 low++ 否则放在基准数后边
temp =arr[low] =2 | ||||
low→ | high | |||
1 | 3 | 8 | 7 | 1 |
temp =arr[low] =2 | ||||
low→ | high | |||
1 | 3 | 8 | 7 | 1 |
此时low位置值 大于基准数应该放后边 也就是赋值给high所在位置 arr[high] = arr[low]
temp =arr[low] =2 | ||||
low | high | |||
1 | 3 | 8 | 7 | 3 |
high位置的值被修改了 开始移动 high 让high指针左移如果大于等于基准数则 high-- 否则放在基准数前边
temp =arr[low] =2 | ||||
low | ←high | |||
1 | 3 | 8 | 7 | 3 |
temp =arr[low] =2 | ||||
low | ←high | |||
1 | 3 | 8 | 7 | 3 |
temp =arr[low] =2 | ||||
low | ←high | |||
1 | 3 | 8 | 7 | 3 |
temp =arr[low] =2 | ||||
high low | ||||
1 | 3 | 8 | 7 | 3 |
此时 low<high 不满足条件 则不再移动 此时 low位置就是 准基数要放的位置 arr[low] =temp;
high low | ||||
1 | 2 | 8 | 7 | 3 |
然后再对基准数左边和右边进行排序即可 也就是{1} 和{8,7,3} 循环此过程即可 自己推导下
下一次结果应是
low在上边 代表移动low到了此位置 | ||||
| low high | |||
1 | 2 | 3 | 7 | 8 |
此时并没有完还有对 {3,7} 进行排序 才是真正的完成
| high low |
| ||
1 | 2 | 3 | 7 | 8 |
过程可能有点复杂,多拿几组数组自己试一试不过代码很简答
算法代码:
package test1;
import java.util.*;
public class Demo {
public static void main(String[] args) {
int arr[] = { 2, 3, 8, 7, 1};
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr, int low, int high) {
// 递归跳出条件 不然会死循环
if (low <high) {
// 我要说一下这个数组 传参传的是指向堆内存中的地址 所以形参数组改变了 实参也会变
// 指向的同一个地址 初学者 实参和形参可能会不太清楚
int index = getIndex(arr,low,high);
// 很多博客都是 quickSort(arr,0,index-1); 这样会让程序多走n多遍不知道有什么用
// 按快排的规则就应该是对index左右再次进行排序 0应该是不对的虽然最后结果肯定对
// 分别对基准数的左边和右边进行排序
quickSort(arr,low,index-1);
quickSort(arr,index+1,high);
}
}
private static int getIndex(int[] arr, int low, int high) {
int temp = arr[low];
while(low < high) {
// 先让high和 基准数进行比较如果 arr[high] >=temp 说明 arr[high]就在基准数后边
while(low < high && arr[high] >=temp) {
high--;
}
// 此时arr[high] 值小于基准数 应该放基准数前边 也就是low这个位置 你总不能说随便放吧
// 所以快排才有了 low high 两个指针
arr[low] =arr[high];
// 然后让 low和 基准数进行比较如果 arr[low] <=temp 说明 arr[low]就在基准数左边
while(low < high && arr[low] <=temp) {
low++;
}
// 此时arr[low] 值大于基准数 应该放基准数右边 也就是high这个位置
arr[high]= arr[low];
}
// 当low<high 时跳出 此时low位置就是基准数应该放的位置
arr[low] =temp;
System.out.println(Arrays.toString(arr));
return low;
}
}