//快速排序,利用partation算法
public class QuickSort {
public static void quickSort(int array[]){
int left = 0;
int right = array.length - 1;
if(array == null || array.length == 0 || array.length == 1 ){
return;
}
sort(array,left,right);
}
public static void sort(int array[],int left, int right){
int i = left;
int j = right;
if(i > j){
return;
}
// 可以用left索引的值作为base
int base = array[left];
while(i != j){
//i和j在内循环是自增和自减得所以i < j不能单独放在最外层的循环条件里
while(array[j] >= base && i < j){
// System.out.println("-----------------向左移动");
j--;
}
while(array[i] <= base && i < j){
// System.out.println("向右移动-----------------");
i++;
}
// 向右移动到的大于基数base的和向左移动小于基数base的则两个互换
// 可以达到基数分割左边的小于基数,右边大于基数
if(i < j){
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
// 把基数赋值到相交索引也就是分割点,再把原来的分割点赋值给left位置
// 当成分割后第一个partition的基数
array[left] = array[i];
array[i] = base;
System.out.println("相遇交叉的索引 i和j "+i+" "+j);
System.out.println("以基数 "+base+"分割的partition");
for(int m : array){
System.out.print("["+m+"]");
}
System.out.println("");
System.out.println("分割后第right索引是>>>>>>>>>>>>>>"+right);
System.out.println("分割后第right索引的数据是>>>>>>>>>>>>>>"+array[right]);
// 递归处理两个分割的partition,最终处理完成
// 第一个partition的right为分割点的前一个索引
sort(array,left,i - 1);
// 第二个partition的left为分割点的后一个的索引
sort(array,i + 1,right);
}
public static void main(String[] args) {
int[] array = {10,5,6,11,7,9,8,13,20,10,3};
quickSort(array);
System.out.println("最后排序的后的数组是------------------");
for(int i : array){
System.out.print("["+i+"]");
}
}
}