思想:设置一个基准数,基准数的左边的数都小于他,右边的数都大于他
过程原理:
1.选择数组中第一个数为基准数
2.设置左右两个节点,分别从最左端、最右端开始往中间靠拢,在这个过程中,如果左节点的数值大于基准数,就停在这个位置上;右节点的数值小于基准数,也停在这个位置上;将这两个数进行交换,然后继续照这样比下去,直至左右节点相遇。
3.当左右节点相遇后,需要将基准数赋值到这个位置上,至此基准数就放在中间。
4.递归调用这个快排方法,把左半部分和右半部分排出来
参考代码:
package com.iweb.ssm.domain;
import java.util.Arrays;
public class Test {
/**
* quickSort需要三个参数:1.一个数组。2.左起始下标left=0。3.右起始下标right=数组长度-1
*/
public static void quickSort(int[] arr, int left, int right) {
//如果左起始下标大于右起始下标就返回。意味着左右节点已经碰头了
if (left > right) return;
int i, j,base,temp;
/**
* i是左节点,j是右节点,base作为基准数,temp是交换时的中间变量
*/
i = left;
j = right;
base = arr[left];
while (i<j){//如果左节点小于右节点,说明左右节点还没有相遇,可以进行比较交换
/**
* 先看右边,
* 如果右节点下标的数值大于等于基准数,且右节点下标大于左节点下标
* 依次往左递减
*/
while (arr[j]>=base && j>i){
j--;
}
/**
* 再看左边,
* 如果左节点下标的数值小于等于基准数,且左节点下标小于右节点下标
* 依次往左递增
*/
while (arr[i]<=base && i<j){
i++;
}
//如果满足左节点的数值大于基准数,右节点的数值小于基准数,就交换位置
if (i<j){
temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
/**
* 以上代码执行完后,说明左右节点已经相遇了
* 现在需要把基准数的值,赋值给相遇的这个位置,i或j都可以
*/
arr[left] = arr[i];
arr[i] = base;
//递归调用左边数组,这里是从left位置开始,到j(相遇的位置)的前一个位置,进行比较交换
//所以是j-1
quickSort(arr,left,j-1);
//递归调用右边数组,这里是从相遇的位置的后一个位置开始(j+1),到right,进行比较交换
quickSort(arr,j+1,right);
}
public static void main(String[] args) {
int [] arr = {10,5,9,2,1,7,3,4};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
}