红桃J

用心写好每行完美的代码,远比写一堆更有价值

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

PS1:如果单纯为做出这道题那么这个代价是O(nlgn),通过排序就可以了。 这里讨论的是O(n)的算法。那么来分析一下这个算法是如何做到O(n)的,算了不分析了,这个推到看起来太麻烦了。其实我想知道的只是结论而已,想感叹的也是partition真是特别好用啊!!!!

代码:

 1 #include<iostream>
 2 #include<ctime>
 3 
 4 using namespace std;
 5 
 6 int size = 10;
 7 
 8 void Swap(int &a, int &b)
 9 {
10     int c = a;
11     a = b;
12     b = c;
13 }
14 
15 void RandomizedSwap(int a[], int p, int r)
16 {
17     srand((int)time(0));
18     int t = rand() % (r - p + 1)+p;
19     Swap(a[p], a[r]);
20 }
21 
22 int RandomizedPartition(int a[], int p, int r)
23 {
24     RandomizedSwap(a, p, r);
25     int x = a[r];
26     int i = p - 1;
27     for (int j = p; j < size - 1; j++)
28     {
29         if (a[j] < x)
30         {
31             i = i + 1;
32             Swap(a[j], a[i]);
33         }
34     }
35     Swap(a[i+1], a[r]);
36     return i + 1;
37 }
38 
39 int RandomizedSelect(int a[], int p, int r, int i)
40 {
41     if (p == r)
42         return a[p];
43     else
44     {
45         int q = RandomizedPartition(a, p, r);
46         if (q -p+1 == i)
47             return a[q];
48         else
49         {
50             if (q -p +1 < i)
51                 return RandomizedSelect(a, q + 1, r, i-q + p-1);
52             else
53                 return RandomizedSelect(a, p, q - 1, i);
54         }
55     }
56 }
57 
58 int main()
59 {
60     int a[] = { 16, 4, 10, 14, 7, 9, 3, 2, 8, 1 };
61     cout << RandomizedSelect(a, 0, 9, 9) << endl;
62 }

 

posted on 2015-03-03 09:21  红桃J  阅读(166)  评论(0编辑  收藏  举报