1、要想理解快速排序,首先得会一个算法,即给定一个数组,要求通过一个方法将大于数组中第一个元素的所有元素放在第一个元素的右边,而将小于或等于第一个元素的所有元素放在第一个元素的左边,如3,2,8,0,7,通过该方法后会变为2,0,3,8,7,小于等于3的在3的左边,大于3的在3的右边,并且其他元素的相对位置没有改变,即原数组中2在0的前面,8在7的前面,新数组中仍然是这样。下面给出该算法:
public int partition(int a[],int start,int end){// end指a数组的长度
int position=start;
int val=a[start];
for(int i=start+1;i<end;i++){
if(a[i]<val){
position++;
exchange(a,position,i);
}
}
exchange(a,start,position);
return position;
}
其中exchange函数是交换两个元素的位置:
<pre name="code" class="java">public void exchange(int a[],int left,int right){
if(left==right)
return;
int temp;
temp=a[left];
a[left]=a[right];
a[right]=temp;
}
2、调用partition函数完成快速排序算法。
public void QuickSort(int a[],int start,int end){
if(start<end)
{ int p=partition(a,start,end);
System.out.println("p="+p);
if(p==start)
QuickSort(a,p+1,end);
else if(p==end-1)
QuickSort(a,start,p);
else{
QuickSort(a,start,p);
QuickSort(a,p,end);
}
}
}
3、测试。
public static void main(String[] args) {
int a[]={3,6,-1,0,-4,6,-11,12,-5,21,10,12,45,23,67};
Sort s=new Sort();
s.QuickSort(a, 0, a.length);
s.P(a);
}
4、结果。
p=5
p=1
p=0
p=1
p=4
p=3
p=2
p=5
p=6
p=9
p=8
p=7
p=9
p=11
p=10
p=11
p=13
p=12
p=13
p=14
数组为:-11 -5 -4 -1 0 3 6 6 10 12 12 21 23 45 67