经典之快速排序

1. 分区(partition)

快速排序是一种利用分区的思想来实现的一个不错的排序算法, 在弄懂快排之前,还得先弄清楚分区(partition)是怎么弄的。

对于给定的数组a,我们从中选择一个值作为中心点(pivot);
定义两个索引变量分别leftScan,rightScan分别指向数组a的第一个元素和最后一个元素;
定义一个while循环
leftScan从左向右扫描直到a[leftScan]>pivot;
rightScan从右向左扫描直到a[rightScan]<pivot;
如果leftScan>=rightScan,break退出循环
否则,交换a[leftScan]和a[rightScan],然后继续循环;
最后会返回leftScan最为pivot的索引。

这样一趟下来 , 就把给定的数组分成以pivot为中心的两个区,pivot左边的是小于pivot的,pivot右边的是大于pivot的。

public class ArrayParti {
private long[] a;
private int nElement;
public ArrayParti(int max) {
a = new long[max];
nElement = 0;
}

public int partition(int left,int right,long pivot){
int leftParti = left-1;
int rightParti = right+1;
while(true){
while(leftParti<right && a[++leftParti]<pivot);
while(rightParti>left && a[--rightParti]>pivot);
if(leftParti>=rightParti)break;
else
swap(leftParti,rightParti);
}
System.out.println("pivot index is:"+leftParti);
return leftParti;
}
private void swap(int one, int two) {
long temp;
temp = a[one];
a[one]=a[two];
a[two]=temp;

}

public void insert(long v){
a[nElement]=v;
nElement++;
}
public void display(){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"\t");
}
System.out.print("\n");
}
}


2.递归实现快速排序
1)数组a中选一个element作为pivot
2)根据选定的pivot给数组分区,左边的都比pivot小,右边的都比pivot大
3)对pivot左边的数据和pivot右边的数据分别递归实现上面的步骤。


public class ArrayQuick1 {
private long[] a;
private int nElement;
public ArrayQuick1(int max) {
a = new long[max];
nElement = 0;
}

public void sort(){
quickSort(0,nElement-1);
}
private void quickSort(int left, int right) {
if(left-right>=0){
return;
}else{
long pivot = a[right];
int partition = partition(left,right,pivot);
quickSort(left,partition-1);
quickSort(partition+1,right);
}
}
private int partition(int left, int right, long pivot) {
int leftParti = left-1;
int rightParti = right;
while(true){
while(a[++leftParti]<pivot);
while(rightParti>0 && a[--rightParti]>pivot);
if(leftParti>=rightParti)break;
else
swap(leftParti,rightParti);
}
swap(leftParti,right);
return leftParti;
}
private void swap(int one, int two) {
long temp;
temp = a[one];
a[one]=a[two];
a[two]=temp;
}

public void insert(long v){
a[nElement]=v;
nElement++;
}
public void display(){
for(int i=0;i<a.length;i++){
System.out.print(a[i]+"\t");
}
System.out.print("\n");
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值