快速排序是对冒泡排序的一种改进。
找到基准,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
代码实现:
package problem;
/*
* 快速排序(找基准)
* 递归实现/非递归实现
* 时间复杂度:好,无序,O(nlog2n) 坏,有序O(n^2)
* 不稳定
* */
import java.util.Arrays;
//从左找比基准大的,从右找比基准小的
public class Fastsort {//返回基准下标
public static int partion(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 Quicksort(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;
}
}
}
public static void Quick(int array[],int start,int end){
//递归实现
int par = partion(array,start,end);//基准的位置
if(par>start+1){//基准左边
Quick(array,start,par-1);
}
if(par<end-1){//基准右边
Quick(array,par+1,end);
}
}
public static void main(String[] args) {
int[] array ={12,42,1,13,2,65,77,18,17,32};
Quick(array,0,array.length-1);//递归实现
Quicksort(array);//非递归实现
System.out.println(Arrays.toString(array));
}
}
运行结果:
过程图: