1.问题
设array是n个元素的集合,从array中选取第k小的元素,其中1<=k<=n.这里的第k小元素是指,当array按从小到大排好序之后,排在第k个位置的元素。
2.解析
特定分治策略参考了快速排序的思想:从集合array中选出一个参考元素m,比m小的数放到m的前面(集合s1),比m大的数放到m的后面(集合s2)。若s1的个数+1恰好等于k(|s1|+1=k),那么集合array的第k小的数就是m。若不等,再用递归的思想从s1或s2中找出该第k小的元素。
3.设计
算法BubbleSort(array, start, end)
//针对解决组内排序的冒泡算法
//输入:集合array,start每组起点,end每组终点
//输出:排序体现在array中,没有输出
len←end-start
for i←0 to len do
flag←1
for j←start to end-i-1 do
if(array[j] > array[j+1]) 交换array[j]和array[j+1],flag←0
if(flag) break;
return;
算法dc(array, k, length)
//找第k小元素的特定分治策略算法
//输入:集合array,k表示第k小元素,length表示array的有效长度
//输出:没有输出
if(length <= 每组长度)
BubbleSort(array, 0, length)
输出array[k-1]
return;
s1[MAXSIZE]←{0}
s2[MAXSIZE]←{0}
mid[MAXSIZE/每组长度]←{0}
left←0
right←0
for i←0 to length-每组长度 do
//i += 每组长度
对每组进行冒泡排序
for j←0 to length/每组长度 do
mid[j]=array[2+j*每组长度]
对集合mid进行冒泡排序
middle←集合mid的中位数
遍历集合array,将每个元素与middle对比,分别将其加入s1或s2
if(k == left+1)输出middle
else if(k <= left) 将s1复制到array,dc(array, k, left)
else 将s2复制到array,dc(array, k-left-1, right)
4.分析
时间复杂度:O(n)