I : 平均情况下的时间复杂度为:O(n) 期望值(expected); 最坏情况下的时间复杂度为:O(n的平方)即:每次对A划分为(0:n-1)
函数命名为:find_k_th(A, p, q, k) //int value = find_k_th(A, p, q, k): value为从A[p]到A[q]中第k小的值
可以从 random-quicksort 算法中(复杂度分析运用了随机变量指示器:indicator of random variable)将数组A进行划分,随机选取主元pivot,得到一个返回的值r(r为数组A中<=pivot 的索引,即:A[r] = pivot,小于pivot的个数为:num = r-p+1 ):
- num = k, 返回A[r], 即:A[r]为所要找的A中第k小的值;
- num < k, 递归地返回 find_k_th(A, r+1, q, k-num), 即:A的左边有num个小于第k小的值,则第k小的值 = 右边的第 k-num 小的值;
- num > k, 递归地返回 find_k_th(A, p, r-1, k), 即: num > k, 第k小的值在A的左边。
因为第I种算法只有平均情况下T(n)才为线性,不能避免最坏的情况;为了使最坏情况下T(n)也为线性,需要每次选择的主元pivot应该确定地处于A的中间,而非随机选择。
方法:递归的划分输入数组A
步骤: