一:
线性时间选择中,最坏情况下时间复杂度为O(n^2) , 但如果在线性时间内找到一个划分基准,使得按照这个基准所划分的两个子数组的长度至少为原数组的k倍( 0<k<1)。
二:
(1) 将n个输入的元素分成 (n-4)/5组,每一组都是5个元素,可能最后一个不是,用任意的排序算法将每组的5个元素排好,然后取出5个元素的中位数。
(2)递归调用Select函数(见程序)找出这(n-4)/5个中位数数的中位数,然后将这个中位数作为划分基准,作为快速排序中的参考值进行排序。
三:
中位数的中位数x作为划分基准时,可以保证图中左上角的部分比x小,图中右下角的部分比x大。所以通过x作为划分基准可以保证大约四分之一的数据比x小,四分之一的数组比x大。不会产生最后情况,该复杂度约为O(N) .
如图所示:.
四:
程序如下:
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define LENGTH 10
using namespace std;
template <class Type