快速排序是一种分区交换排序算法。
1.概述
2.实现
3.分析
快速排序(Quick Sort)算法描述:在数据序列中选择一个元素作为基准值,每趟从数据序列的两端开始交替进行,将小于基准值的元素交换到序列前端,将大于基准值的元素交换到序列后端,介于两者之间的位置则成为基准值的最终位置。同时,序列被划分成两个子序列,再分别对两个子序列进行快速排序,直到子序列长度为1,则完成排序。
关键字序列{38,38*,97,75,61,19,26,49}快速排序(升序)一趟划分过程如图所示,{}表示待排序子序列。
快速排序(升序)的一趟划分过程
快速排序(升序)过程
快速排序算法采用分治策略对两个子序列再分别进行快速排序,因此,快速排序是递归算法。快速排序算法实现如下:
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;
System.out.println(begin+".."+end+",vot="+vot+" ");
quickSort(keys, begin, i-1);
quickSort(keys, i+1, end);
}
}
//调用
public static void main(String[] args) {
int[] temp = new int[10000000];
for (int i = 0; i < temp.length; i++) {
temp[i] = new Random().nextInt(10000000)+1;
}
long before = System.currentTimeMillis();
quickSort(temp,0,temp.length-1);
long after = System.currentTimeMillis();
System.out.println("quick="+(after - before));
}
快速排序算法分析
- 快速排序的执行时间与数据序列的初始排列及基准值的选取有关,分析如下。
① 最好情况,每趟排序将序列分成长度相近的两个子序列,时间复杂度为O(n×logn)。
② 最坏情况,每趟将序列分成长度差异很大的两个子序列,时间复杂度为O(n2)。
2.快速排序的执行空间复杂度
① 最好情况,每趟排序将序列分成长度相近的两个子序列,空间复杂度为O(logn)。
② 最坏情况,每趟将序列分成长度差异很大的两个子序列,空间复杂度为O(n)。
总结
快速排序选择基准值还有其他多种方法,如可以选取序列的中间值等。但由于序列的初始排列是随机的,不管如何选择基准值,总会存在最坏情况。