快速排序,是选取数组中的一个随机值作为参考值,使其左边的元素小于参考值,右边的元素大于参数值。
一般的情况下我们选取的是数组的中间索引所在的值作为参考值的。
sort(arr,left,right), 循环使用索引为 lt = left, rt = right;
排序之后小于参考值的在rt的左边,大于参考值的在lt的右边
代码示例,以及相应位置说明
package com.study.algorithm;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args){
int[] arr = {-1,3,5,10,100,-20,30,50,2,3,5,7,3};
sort(arr,0,arr.length -1);
System.out.println(Arrays.toString(arr));
}
public static void sort(int[] arr, int left, int right){
int mid = (left + right) / 2;
int lt = left;
int rt = right;
int mv = arr[mid];
int tmp = 0;
while (lt < rt){
while (arr[lt] < mv){
lt++;
}
while (arr[rt] > mv){
rt --;
}
//判断以防止数组越界
if(lt >= rt){
break;
}
//执行到这 说明左边值大于等于 mv。 且右边值小于等于 mv
tmp = arr[lt];
arr[lt] = arr[rt];
arr[rt] = tmp;
//如果不做这一步,当数组中存在多个相同执行,会出现死循环
//如 2,2,2
if(arr[lt] == mv){
rt --;
}
if(arr[rt] == mv){
lt ++;
}
}
//lt == rt的情况是,排序后,mv值在最右边,或是在最左边。会出现栈溢出
// arr[] lt,rt
//如:3,1,2 0,2
// 3,1,2 0,1
// 1,3,2 0,0, 执行后续操作,就会相同数据,一直入栈操作
if(lt == rt){
lt ++;
rt --;
}
if(left < rt){
sort(arr,left,rt);
}
if(right > lt){
sort(arr,lt,right);
}
}
}