当主元为数组最后一个元素时的实现:
package offer.giveme;
//实现算法导论上的快速排序方法
public class QuickSort {
public int partition(int[] num,int low,int high){
//分割方法,将数组的最后一个元素作为主元。
//low为当前需划分子数组的下界,high为上界
int i=low-1;
int j=low;//i为已经比较完成的小于主元的部分的右边界,j指向待比较元素
int x=num[high];//主元
for(;j<high;j++){
if(num[j]<=x){
i++;
exchange(num,i,j);//与大于主元的第一个元素交换,小于主元部分长度增加一
}
}
exchange(num,high,i+1);//最后将主元与大宇主元部分的第一个元素交换位置
return i+1;
}
public void quickSort(int[] num,int low,int high){
if(low<high){
int q=partition(num,low,high);
quickSort(num,low,q-1);
quickSort(num,q+1,high);
}
}
public void exchange(int[] num,int i,int j){
int temp;
temp=num[i];
num[i]=num[j];
num[j]=temp;
}
public static void main(String[] args) {
int[] num={8,7,1,3,5,6,4};
new QuickSort().quickSort(num, 0, 6);
for(int a:num)
{
System.out.print(a+" ");
}
}
}
主元为数组第一个元素时的实现:
package offer.giveme;
//实现当主元在第一个元素时的快速排序
public class QuickSort2 {
public int partition(int[] num,int low,int high){
int x=num[low];
int i=low;
int j=high;
while(i<j){
while(i<j&&num[j]>=x)
--j;
num[i]=num[j];
while(i<j&&num[i]<=x)
++i;
num[j]=num[i];
}
num[i]=x;
return i;
}
public void quickSort(int[] num,int low,int high){
if(low<high){
int q=partition(num,low,high);
quickSort(num,low,q-1);
quickSort(num,q+1,high);
}
}
public void exchange(int[] num,int i,int j){
int temp;
temp=num[i];
num[i]=num[j];
num[j]=num[i];
}
public static void main(String[] args) {
int[] num={3,6,5,1,12,3,4,10};
new QuickSort2().quickSort(num, 0, 7);
for(int a:num){
System.out.print(a+" ");
}
}
}