算法步骤:
假设待划分序列为r[low],r[low+1],……,r[high]。首先将基准记录r[low]移至变量x中,是r[low]相当于空单元,然后反复进行如下两个扫描过程,直到low和high相遇。
1、high从右向左扫描,直到r[high]<x
时,将r[high]移至空单元r[low],此时r[high]相当于空单元。
2、low从左向右扫描,直到r[low]>=x
时,将r[low]移至空单元r[high],此时r[low]相当于空单元。
当low和high相遇时,r[low](或r[high])
相当于空单元,且r[low]左边所有记录的关键字均小于基准记录的关键字,而r[low]
右边所有记录的关键字均大于或等于基准记录的关键字。最后将基准记录移至r[low]
中,就完成了一次划分过程。对于r[low]
左边的子表和r[low]
右边的子表可采用同样的方法进一步划分。
示例代码:
public class QuickSort
{
public static void qkSort(int arr[],int low,int high){
if(low<high){
int pos=qkPass(arr,low,high); /**/
qkSort(arr,low,pos-1);
qkSort(arr,pos+1,high);
}
}
public static int qkPass(int arr[],int low,int high){
int x=arr[low]; //选择基准记录
while(low<high){
while(low<high&&arr[high]>x) //high从右到左找小于x的记录
high--;
if(low<high){ /*找到小于x的记录,则送入“空单元”r[low]*/
arr[low]=arr[high];
low++;
}
while(low<high&&arr[low]<x) //low从左到右找大于或等于x的记录
low++;
if(low<high){ /*找到大于x的记录,则送入“空单元”r[high]*/
arr[high]=arr[low];
high--;
}
}
arr[low]=x; //将基准记录保存到low=high的位置
for(int i=0;i<arr.length;i++)
System.out.print(arr[i]+" ");
System.out.println();
return low; //返回值为基准记录的位置
}
public static void main(String[] args)
{
int length=(int)(Math.random()*10)+6;
//System.out.println(length);
int[] array=new int[length];
for(int j=0;j<length;j++){
array[j]=(int)(Math.random()*100);
//System.out.println(array[j]);
}
qkSort(array,0,length-1);
System.out.println("排序后的序列如下:");
for(int i=0;i<array.length;i++)
System.out.print(array[i]+" ");
System.out.println();
}
}
算法分析: