Java快速排序实例
快速排序是冒泡排序的改进版本,它的思想是通过一趟排序讲待排序的记录分隔成独立的两部分,其中一不分记录的关键字均小于另一部分关键字,则可以分别对这两部门记录继续进行排序 ,以打倒整个虚列的有序。
假设待排序的虚列为{L.r[s],L.r[s+1],.......,L.r[t]]} ,首先选取一个记录(通常可一选择第一个记录L.r[s])作为枢轴(或支点),然后按照下述原则重新排列其他记录,讲所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位置之后。由此可以该 “枢轴” 记录最后所落的位置i作为分界,将序列{L.r[s],L.r[s+1],.......,L.r[t]]} 分隔成了两个子序列{L.r[s],L.r[s+1],.......,L.r[i-1]]} 和 {L.r[i+1],L.r[s+1],.......,L.r[t]]} ,这个过程叫作一趟快速排序(或者一次划分).
一趟快速怕序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为privotkey,则首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指向的位置起向后搜索,找到第一个关键字大于privotkey的记录和枢轴记录互相交换,重复这两步直至lowhigh位置.
/**
*采用交换方式排序
*/
package排序.交换排序;
importjava.util.concurrent.Executor;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
publicclass快速排序{
publicstaticvoidmain(Stringargs)throwsInterruptedException{
inttest={15,23,56,7,13,52,20,7};
new快速排序().qSort(test,0,test.length-1);
for(intk:test)System.out.println(k);
}
publicvoidqSort(intarray,intlow,inthigh){
if(low
intprivot=partition(array,low,high);
qSort(array,low,privot-1);
qSort(array,privot+1,high);
}
}
publicintpartition(intarray,intlow,inthigh){
/**
*选择low位置作为曲轴(支点)
*/
intpivot=array[low];
inttemp=0;
/**
*如果low
*/
while(low
/**
*先从high端开始判断
*/
while(low=pivot)high;
/**
*进行置换操作
*/
if(low
temp=array[low];
array[low]=array[high];
array[high]=temp;
low++;
}
/**
*从low端判断
*/
while(low
/**
*进行置换操作
*/
if(low
temp=array[high];
array[high]=array[low];
array[low]=temp;
high;
}
}
returnlow;
}
}
具体实现上述算法时候,每交换一对记录需要进行三次记录的移动(赋值)的操作,而实际上,在排序过程中对枢轴记录的赋值是多余的,因为只有在一趟排序结束时,即lowhigh的位置菜市枢轴记录的最后位置,由此可改写上述算法,先将记录暂时存在r[0]的位置上,排序过程中做r[low]或 r[high]的单向移动,直至一趟排序后再将枢轴记录移至正确位置上.
/**
*改进的快速排序
*/
package排序.交换排序;
importjava.util.concurrent.Executor;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
publicclass快速排序_1{
publicstaticvoidmain(Stringargs)throwsInterruptedException{
inttest={15,23,56,7,13,52,20,7};
new快速排序_1().qSort(test,0,test.length-1);
for(intk:test)System.out.println(k);
}
publicvoidqSort(intarray,intlow,inthigh){
if(low
intprivot=partition(array,low,high);
qSort(array,low,privot-1);
qSort(array,privot+1,high);
}
}
publicintpartition(intarray,intlow,inthigh){
/**
*选择low位置作为曲轴(支点)
*/
intpivot=array[low];
inttemp=0;
/**
*如果low
*/
while(low
/**
*先从high端开始判断
*/
while(low=pivot)high;
/**
*进行置换操作
*/
if(low
array[low]=array[high];
low++;
}
/**
*从low端判断
*/
while(low
/**
*进行置换操作
*/
if(low
array[high]=array[low];
high;
}
}
array[low]=pivot;
returnlow;
}
}
| 广告合作:400-664-0084 全国热线:400-664-0084 Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号 珠峰网 版权所有 All Rights Reserved
|