作为快速排序的扩展应用,这里介绍一个选择第k个最小元素的问题。
1. 问题描述
给定线性序列中的n个元素和一个整数k, 0<=k<n, 要求找出这n个元素中第k小元素。
2. 求解方法
2.1 直接排序
使用quick sort, 然后选择第k个元素,需要的时间复杂度为O(n*logn).
2.2 利用快速排序思想求解【分治法】
在快速排序中我们用到partition方法每次可以找出中间元素,能够保证左边的元素都比它小,而右边的都比它大。所以可以利用这一点,让我们在O(n)的平均时间内找出第K个元素。
1 int partition(int int_array[], int low, int high) 2 { 3 int first = low, last = high; 4 int key = int_array[first]; 5 6 while(first < last) 7 { 8 while(first < last && int_array[last] >= key) --last; 9 int_array[first] = int_array[last]; 10 while(first < last && int_array[first] <= key) first++; 11 int_array[last] = int_array[first]; 12 } 13 int_array[first] = key; 14 return first; 15 } 16 17 int select(int a[], int low, int high, int k) 18 { 19 int index = partition(a, low, high); 20 if(index == k) 21 return a[index]; 22 else 23 { 24 if(k < index) 25 select(a, low, index-1, k); 26 else 27 select(a, index+1, high, k-index); 28 } 29 }
原文:http://www.cnblogs.com/david-wang/p/4340138.html