1.思路:在数组中找一个值作为中间值key,然后从数组右边开始向左边寻找小于key值放到key的左边,同时从数组的左边向右边寻找大于key值放到key的右边(时间复杂度nlogn);
2.具体步骤:
(1)定义全局变量i,赋值等于start
(2)定义全局变量j,赋值等于end
(3)定义key值,等于array[i]
(4)后面会交换array[i]和array[j]值,同时i会不断增加,j会不断减小,所以只要i<j,都会循环处理
(5)从下标为j开始,向下走,直到找到比key值小的值的下标(目标是找到比key值小的值,交换到key左边)
(6)同时设置array[i]位置的值为找到比key小的值(i位置装小于key的值了,所以要做i++操作,下次相当于操作i+1)
(7)从下标为i开始,向上走,直到找到比key值大的值的下标(目标是把比key大的值,交换到key的右边)
(8)同时设置array[j]值等于i找到的大值,同事j--,因为j位置存放了新值,下次就相当于操作j-1
(9)每轮找一个小于key的值,再找一个大于key的值,进行交换,只要i<j还成立,循环执行轮操作
(10)最后结束了i肯定=j了,所以设置array[i]=key,中间值
(11)递归操作[start,key下标-1]部分数据,小于key部分的,满足条件是start<key下标-1
(12)递归操作key下标+1,end部分,大于key部分的,满足条件是end>key下标+1
3.代码例子:
例子:
/**
* @Author: hs
* @Description: 快速排序
* @Date: 2021-01-28 17:36
*/
public class quickSort {
public static void main(String[] args) {//任意定义一个数组
int[] array = {10, 8, 7, 3, 7, 29, 15, 56, 5};
System.out.println(Arrays.toString(array));
QuickSort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
/*需要递归处理*/
public static int[] QuickSort(int[]array,int start,int end){
int i = start;
int j = end;
int key = array[i];
while (i<j){
//循环找一个比key小的值
while (i<j&&array[j]>key){
j--;
}
//找到了设置array[i]值为找到的小值
if(i<j){
array[i] = array[j];
i++;
}
//循环找一个比key大的值
while (i<j&&array[i]<key){
i++;
}
if(i<j){
array[j] = array[i];
j--;
}
}
array[i] = key;
if(start<i-1){
QuickSort(array,start,i-1);
}
if(end>i+1){
QuickSort(array,i+1,end);
}
return array;
}
}