原理
1、 从待排序区间选择一个数,作为基准值(pivot);
2.、Partition: 遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边,将比基准值大的
(可以包含相等的)放到基准值的右边;
3、采用分治思想,对左右两个小区间按照同样的方式处理,直到小区间的长度为1, 代表已经有序,或者小区间的长度 == 0,代表没有数据。
partion原理?
如对于数组{6, 1,2, 7,9 , 3,4 , 5,10 , 8 }
代码实现:
public void quickSort(int[] array){
quick(array,0,array.length-1);
}
public void quick(int[] array,int low,int high){
if(high-low+1<=100){
insertSort(array,low,high);
return;
}
int par = partion(array,low,high);
if(par>low+1){
quick(array,0,par-1);
}
if(par<high-1){
quick(array,par+1,high);
}
}
public int partion(int[] array,int low,int high){
int tmp= array[low];
while (low<high){
while (low < high && array[high]>=tmp){
high--;
}
array[low] = array[high];
while (low < high && array[low]<=tmp){
low++;
}
array[high] = array[low];
}
array[low] = tmp;
return low;
}
非递归 用栈实现:
public void quickSort2(int[] array){
Stack<Integer> stack = new Stack<>();
int low = 0;
int high = array.length-1;
int par = partion(array,low,high);
if(par>low+1){
stack.push(low);
stack.push(par-1);
}
if(par<high-1){
stack.push(par+1);
stack.push(high);
}
while (!stack.empty()){
high = stack.pop();
low = stack.pop();
par = partion(array,low,high);
if(par>low+1){
stack.push(low);
stack.push(par-1);
}
if(par<high-1){
stack.push(par+1);
stack.push(high);
}
}
}