一、题目描述
Implement Quicksort and answer the following questions.
(1) How many comparisons will Quicksort do on a list of n elements that all have the same value?
(2) What are the maximum and minimum number of comparisons will Quicksort do on a list of n elements, give an instance for maximum and minimum case respectively.
二、快排
分:选取末尾数作为划分数,将每个数与它比较,小的放前面,大的放后面,最后将划分数放在交界位置。
治:对左右两个数组递归
排序过程如图:
伪代码:
java实现:
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[]arr={2,8,7,1,3,5,6,4};
QUICKSORT(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void QUICKSORT(int[] arr,int p, int r) {
if(p<r){
int q=PARTITION(arr,p,r);
QUICKSORT(arr,p,q-1);//划分数左边
QUICKSORT(arr,q+1,r);//划分数右边
}
}
private static int PARTITION(int[] arr, int p, int r) {
int x=arr[r];//最后一个数作为划分数
int i=p-1;
for(int j=p;j<=r-1;j++){
if(arr[j]<=x){
i++;
swap(arr,i,j);
}
}
swap(arr,i+1,r);
return i+1;
}
private static void swap(int[] arr,int i,int j)
{
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
三、问题
(1)对元素都相同的大小为n的数组,快排需要多少次比较?
n(n-1)/2次,为最坏情况
(2)对大小为n的数组,快排的最好情况和最坏情况,举例。
最好:每次都选中中位数 O(n^2)
最坏:每次都选中最大/最小数 O(nlgn)