/**
* 快速排序:在数据序列中选择一个元素作为基准值,每趟从数据序列的两端开始交替进行,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列后端,
* 介于两者之间的位置则成为基准值的最终位置。同时,序列被划分为两个子序列,再分别对两个子序列进行快速排序,知道子序列长度为1,则完成排序。
* 最好情况,每趟排序将序列分成长度相近的两个子序列,时间复杂度为O(n*log(2)n)
* 最坏情况,每趟将序列分成长度差异很大的两个子序列,时间复杂度为O(n^2)
* 快速排序是不稳定的
* 当n较大且数据序列随机排列时,快速排序是“快速”的,当n很小或基准值选取不合适时,快速排序较慢。
* @author
*
*/
public class quickSort {
public static void quickSort(int[] keys){
quickSort(keys,0,keys.length-1);
}
public static void quickSort(int[] keys,int begin,int end){
if(begin>=0&&begin<keys.length&&end>=0&&end<keys.length&&begin<end){//序列有效
int i=begin,j=end;
int vot = keys[i];//选取第一个值作为基准值
while(i!=j){
while(i<j&&keys[j]>=vot) j--;//从后向前找较小值,不移动与基准值相等的元素
if(i<j) keys[i++] = keys[j];//子序列中较小值向前移动
while(i<j&&keys[i]<=vot) i++;//从前向后找较大值
if(i<j) keys[j--] = keys[i];//子序列中较大值向后移动
}
keys[i] = vot;//基准值到达最终位置
quickSort(keys,begin,j-1);//前端子序列快排
quickSort(keys,i+1,end);//后端子序列快排
}
}
public static void main(String[] args) {
int[] keys = {432,34,35,48,34,4,233};
quickSort(keys);
for(int item:keys) System.out.print(item+" ");
}
}
快速排序quickSort
最新推荐文章于 2018-10-19 00:18:42 发布