1. 分析
1. 想法
基准值
小的放左边,大的放右边
一般以第一个为基准
双指针+分治思想
2.思想:
将选中的Key进行排序,小于key的放左边,大于Key的放右边,key放中间 之后将小于key的进行快排,大于key的进行快排,这样就是整体的快排了。
2. 图解
1.初始化
2个指针,一个指针在左边,一个指针在右边,key取第一个
步骤1![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/eedfe2de34334e36b1166bf100c1089e.png)
步骤2
这时候,将0位的想象为空,或者说,我们选择key的时候就已经把他取出来了
核心思想,就是不符合条件的填到空中,所以移动的是不为空的那个指针
这时候开始动right,right往左走
48< array[right]=40
所以 array[left] = array[right]
步骤3
这时候由于right是空,所以移动left
array[left] = 15 < 48 符合要求,所以继续移动
步骤4
24 < 48 left指针继续右移
步骤5
59 > 48 不符合要求,所以这时候将59放到right位置,准备移动right
步骤6
right左移,
48 < 97 符合要求,位置不变
步骤7
48 < 79 right左移
步骤8
48 < 64 right左移
步骤9
right与left碰到,因为有一个为空,所以这里必定为空,所以将key填入即可,之后分别递归左边和右边
3.代码
public static void quicksort(int arr[],int left, int right){
if (left >= right){
return;
}
int key = arr[left];
int start = left;
int end = right;
while(start != end){
// 开始end从右往左走
while(key <= arr[end] && end > start){
end--;
}
// 遇到 不符合条件的 将位置与start互换
if (start == end){
arr[start] = key;
break;
}
arr[start] = arr[end];
// 这时候 end为空,其实不为空,但是算个重复值,到时候替换即可 start左移
while(key > arr[start] && end > start){
start++;
}
// start遇到不符合条件的
if (start == end){
arr[start] = key;
break;
}
arr[end] = arr[start];
}
// 遍历左边
quicksort(arr,left,start-1);
// 遍历右边
quicksort(arr,start+1,right);
}