package com.lxj.alg;
public class QuickSorted {
public static void main(String[] args) {
int [] array = {545,654,2,-11,24,745,58,35,64,75,253,35};
//int [] array = {10,9,8,7,6,5,4,3,2,1,0};
quickSorted(array,0,array.length-1);
for (int i : array) {
System.out.print(i+" ");
}
}
private static void quickSorted(int[] array, int start, int end) {
if(start < end) {
//lookForLocation 返回一趟快速排序的结果,
//也就是确定了边界线(边界线实际上就是你用来比较的靶子)左边的比右边的都小
int loc = lookForLocation(array,start,end);
//类似二分法,递归分治的思想,靶子左边和右边的分别继续递归排序
quickSorted(array,start,loc-1);
quickSorted(array,loc+1,end);
}
}
private static int lookForLocation(int[] array, int start, int end) {
int i = start,j = end;
//temp就是靶子,也就是我用来分割的基准,
//我用的是array中的第一个元素来进行左边跟右边的划分
//好比: 44,33,25,67 44是我的基准,这一趟排序后我要将数组变成 25,33,44,67
int temp = array[start];
while(i < j){
//从数组右边找,直到找到比基准小的整数
while(array[j] >= temp && i < j)
j--;
//找到比基准小的数就将它复制给array的第一个索引的位置,
//因为第一个索引的位置我用temp记录下来了
array[i] = array[j];
//然后从数组左边找,直到找到比基准大的整数
while(array[i] <= temp && i < j)
i++;
//大于基准的赋值给j位置的整数,
//因为前面我已经记录下array[j]的值:array[i] = array[j];
array[j] = array[i];
}
//最后讲temp中的值赋值回去,因为前面while循环中有一个重复数据
array[i] = temp;
//返回这趟划分的基准的位置(也就是左边小于或等于temp,右边大于或等于temp)
return i;
}
}