采用“分而治之”的思想,将大的分为小的,小的再拆分为更小的。
原理:对于给定的一组记录,通过一趟排序,将原序列分为两部分,其中一部分的所有记录均比另一部分小;再依次对前后两部分的记录进行快速排序,递归该过程。
1、拆分
拆分算法由两个指针开始工作,两个指针分别指向数组两头(非C++中的指针),leftPtr向右移动,直至遇到比pivot大的,暂停;rightPtr向左移动,直至遇到比pivot小的,暂停;两者交换。
leftPtr初始化时是在第一个数据项的左边一位,rightPtr初始化是在最后一个数据项的右边一位,因为它们工作之前,都要分别加一和减一:
while(theArray[++leftPtr]<pivot)//find bigger one
;
while(theArray[--rightPtr]>pivot)//find smaller one
;
swap(leftPtr,rightPtr);//swap elements
拆分算法:
public int partionIt(int left,int right,long pivot){
int leftPtr = left - 1;
int rightPtr = right + 1;
while(true){
while(leftPtr < right && theArray[++leftPtr] < pivot)
;
while(rightPtr > left && theArray[--rightPtr] > pivot)
;
if(leftPtr >= rightPtr)
break;
else
swap(leftPtr,rightPtr);
}
return leftPtr;
}
交换:
public void swap(int dex1,int dex2){
long temp;
temp = theArray[dex1];
theArray[dex1] = theArray[dex2];
theArray[dex2] = temp;
}
2、快速排序:
public void quickSort(int left,int right){
if(right-left<=0)
return;
else{
int partition = partionIt(left,right);
quickSort(left,partition-1);
quickSort(partition+1,right);
}
}