• 算法导论 寻找第i小元素 9.2


    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 }
  • 相关阅读:
    UVA
    UVA
    UVA
    UVA
    NLP介绍
    新建Springboot项目
    添加ssh密钥
    git 错误合集
    Git入门操作
    Hadoop MapReduce
  • 原文地址:https://www.cnblogs.com/chaiwentao/p/4310161.html
Copyright © 2020-2023  润新知