快速排序算法,又名分区交换排序算法。
基本思路:从n个待排序的记录中任取一个记录(不妨取第1个记录),设法将该记录放置于排序后它最终应该放的位置,使它前面的记录排序码不大于它的排序码,而后面的记录排序码都大于它的排序码,然后对前、后两部分待排序记录重复上述过程,可以将所有记录放于排序成功后的相应位置,排序即告完成。
将思路转换成可执行的代码,需要一定的编程经验。
首先,理清算法的基本思路,分区交换排序算法思路可分为:
1、从n个待排序的记录中任取一个记录(不妨取第1个记录);
2、设法将该记录放置于排序后它最终应该放的位置;
位置要求:它前面的记录排序码不大于它;(前部分)
它后面的记录排序码都大于它;(后部分)
3、然后对前、后部份待排序记录重复上述过程;
假设有数组static int[] array={126,272,8,165,123,12,28};
首先需要对数组操作的方法static void quicksort(){}
我们看思路1:从n个待排序的记录中任取一个记录(不妨取第1个记录);
则在方法体里写:
int tab=array[0];
再看思路2:设法将该记录放置于排序后它最终应该放的位置;
那么,我们只要将其他所有记录排序与tab做比较,比tab小的记录放在tab的左边任何位置就可以了:
for(int i=1;i<array.size();i++){
if(tab>array[i]){
moveLeft(i,location);//i为当前比tab小的记录在array中的位置,location为tab左边某位置,我们就把它设为数组最左端好了
//因为当array[i]放置在最左端时候,i之前的记录数量不变,所以不影响结果
}
}
static void moveLeft(int i,int location){
int tab=array[location];
for(int i=location;i>move;i--){
array[i]=array[i-1];
}
array[move]=tab;
}
然后思路1、2就完成了
思路3需要重复上述过程,那么我们就需要注意方法的结束条件,
我们可以认为:当前后部份只剩下一个记录时,就无需再做分区处理,而且我们可以设置成前、后边界,也可以设置前、后数组;
这里我们设置前、后边界,当前边界与后边界相等时,只剩下一个记录,无需再做比较:
static void quicksort(int left,int right){//left自然为array的左边界,right为array右边界
int tab=array[left];
if(left<right){
for(int i=left+1;i<=right;i++){//left+1到right为array中除array[left]的其它所有记录
if(tab>array[i]){
moveLeft(i,location);//i为当前比tab小的记录在array中的位置,location为tab左边某位置,我们就把它设为数组最左端好了
}
quicksort(left, 前部分的右边界 );//对前部份重复上述过程
quicksort( 后部分的左边界 ,right);//对后部份重复上述过程
}
}
}
由上可见我们还缺乏一个对象来确定前部分的右边界与后部分的前边界,这个如何确定呢?
我们就需要知道我们在分区后,tab的位置在哪儿,我们就需要设置一个对象来记录tab位置的改变
我们来观察tab位置是如何变化的:
开始的时候tab的位置在left处,当遇到一个比tab小的值时,tab往右移动一位,那么我们设置对象 int locationtab=left;
static void quicksort(int left,int right){
if(left<right){
int tab=array[left];
int locationtab=left;// 开始的时候tab的位置在left处
for(int i=left+1;i<=right;i++){
if(tab>array[i]){
moveLeft(i,location);
locationtab++; // 当遇到一个比tab小的值时,tab往右移动一位,
}
quicksort(left, locationtab-1 );//对前部份重复上述过程
quicksort( locationtab+1,right);//对后部份重复上述过程
}
}
}
在该过程中,分区算法应当是稳定的排序算法;