码迷,mamicode.com
首页 > 其他好文 > 详细

选择中位数(第k大的数)

时间:2015-02-01 16:00:10      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

  在查找中位数时,我们可以先排序,再找中间位置的数值即可,这样时间复杂度是O(nlbn).

  参考快速排序的分割算法,我们可以得到O(n)复杂度的算法。

  首先,把问题推广到查找第k小的数,每次分割之后,我们只需要在pivot的一侧查找即可。

 1 #define swap(a, b)    do { int    temp = a; a = b; b = temp; } while (0)
 2 
 3 int partition(int A[], int left, int right)
 4 {
 5     int povit = left;
 6     int l = left, r = right;
 7 
 8     while (l <= r)
 9     {
10         while (l <= right && A[l] <= A[povit])
11             l++;
12         while (r >= left && A[r] > A[povit])
13             r--;
14         if (l < r)
15             swap(A[l], A[r]);
16     }
17     swap(A[povit], A[r]);
18     povit = r;
19     return povit;
20 }
21 
22 int select_kth(int A[], int left, int right, int k)
23 {
24     int povit = left;
25     
26     if (left == right)
27         return A[povit];
28 
29     povit = partition(A, left, right);
30     if (povit - left + 1 >= k)
31         select_kth(A, left, povit, k);
32     else
33         select_kth(A, povit + 1, right, k - (povit - left + 1));
34 }

时间复杂度: T(n) = T(n/2) + n ==>> T(n) = O(nlbn) 

 

选择中位数(第k大的数)

标签:

原文地址:http://www.cnblogs.com/ym65536/p/4265608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!