动态图
![](https://img-blog.csdnimg.cn/img_convert/e719f14ddfa17cb62fb94bc592edb616.gif)
![](https://img-blog.csdnimg.cn/img_convert/daed2df664ef7d470f908cd7a2e92148.gif)
快速排序的核心思想是分治法,分而治之。它的实现方式是每次从序列中选出一个基准值,其他数依次和基准值做比较,比基准值大的放右边,比基准值小的放左边,然后再对左边和右边的两组数分别选出一个基准值,进行同样的比较移动,重复步骤,直到最后都变成单个元素,整个数组就成了有序的序列。
简单概括如下:
从数列中挑出一个元素,称为 “基准”(pivot);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
/**
* 功能描述 : 快速排序(重复性操作 且有终止条件就可以考虑用 递归)
*
* 用到了:双指针算法(不需要开辟额外空间)
* 难点: 两个元素之间互换位置(用了双指针算法)
*
* @author guoyiguang
* @date 2023/1/6
* @param
* @return
*/
public int[] quickSort(int[] array ,int start ,int end){
// 11,4,8,2,10 以 8 为分区点
// 11,4, 8, 2,10
// 2,4, 8, 11,10
// i 从 4 开始向右移动 ,同时 j 从 10 开始向左移动,i 小于8 的就继续右移动 , j 大于 8 继续左移动
// 当 i 大于 8 停止,j 小于 8 j也停止,然后这两个元素 互换位置
if(start == end ){
return array;
}
int middle = (start+end)/2 ;
int middleValue = array[middle];
// middle = 3
// 3,4 value 11 ,10
for(int i = start ; i <= middle ; i++){
if(array[i] >= middleValue){
//
for (int j = end ; j >= middle ; j--){
if(array[j] < middleValue){
// 数组两元素交换位置
int tem = array[i] ;
array[i] = array[j];
array[j] = tem ;
}
}
}
}
// 左边
quickSort(array,start,middle);
// 右边
quickSort(array,middle+1,end);
return array;
}