我们先来举列子了解一下快速排序:
如图,我们以队伍第一个元素为基准,然后我们从后面找比基准大的值后,将他的值
放到基准的位置(注意 原位置还是他的值)
一次后:
第二次:
第三次:
第四次:
最后一次:
当两边的指标重合时,将基准放的那个位置,然后一次快速排序结束,
结束后的结果是,基准左侧,全是比他小的,基准右侧全是比他大的。
而递归就是一次快速排序后,两边递归子序列快排,函数实现:
public static int partio1(int []array,int low,int high ){
int tmp = array[low];
while(low<high){
while(low<high&& array[high]>=tmp){
--high;
}
if(low >=high){
break;
}else{
array[low] = array[high];
}
while(low<high&&array[low]<=tmp){
++low;
}
if(low>=high){
break;
}else{
array[high] =array[low];
}
}
array[low] = tmp;
return low;
}
public static void Quick(int array[],int start,int end){
int par = partio1(array,start,end);
if(par > start+1){
Quick(array,0,par);
}
if(par <end-1){
Quick(array,par+1,array.length-1);
}
}
public static void Quicksort(int array[]){
Quick(array,0,array.length-1);
}
非递归:
这是一次快排后的结果,我们将,基准两侧控制范围的下标入栈。
0到4是基准左侧的下标范围,6到8是基准右侧的下标范围,然后让8和6出栈,对这
个范围的子问题快排,如若大于一个元素,继续入栈,知道有序,类似递归,再让右
边有序,最终使得序列有序。
代码:
public static int partion(int[] array,int low,int high){
int point = array[low];
while(low < high){
while(low < high && array[high] >= point){
high--;
}
if(low >= high){
break;
}else{
array[low] = array[high];
}
while(low < high && array[low] <= point){
low++;
}
if(low >= high){
break;
}else{
array[high] = array[low];
}
}
array[low] = point;
return low;
}
public static void Quicks(int[] array){
int[] stack = new int[array.length];
int top = 0;
int low = 0;
int high = array.length-1;
int par = partion(array,low,high);
//入栈
if(par > low+1){
stack[top++] = low;
stack[top++] = par-1;
}
if(par < high-1){
stack[top++] = par+1;
stack[top++] = high;
}
//出栈
while(top > 0){
high = stack[--top];
low = stack[--top];
par = partion(array,low,high);
if(par > low+1){
stack[top++] = low;
stack[top++] = par-1;
}
if(par < high-1){
stack[top++] = par+1;
stack[top++] = high;
}
}
}