zoukankan      html  css  js  c++  java
  • 6.快速排序

    复制代码
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    using namespace std;
    
    int N, n[100 + 2];
    
    void swap(int &a, int &b)
    { int c = a; a = b, b = c; }
    
    void Q_sort(int n[], int l, int r)
    {
        if(l > r) return ;
        
        int mid = l + rand() % (r - l + 1), j = l - 1;
        swap(n[mid], n[r]); 
        mid = r;
        
        for(int i = l; i < r; i++)
            if(n[i] <= n[mid]) swap(n[i],n[++j]);
        swap(n[mid], n[++j]);
        
        Q_sort(n, l, j - 1);
        Q_sort(n, j + 1, r);
    }
    
    int main()
    {
        cin >> N;
        for(int i = 1; i <= N; i++)
            cin >> n[i];
    
        srand(time(NULL));
        Q_sort(n, 1, N);
        
        for(int i = 1; i <= N; i++)
            cout << n[i] << " " ;
        cout << endl;
        
        return 0;
    }
    //时间复杂度: //随机优化之前:O(nlgn) ~ O(n^2) //随机优化之后:O(nlgn)
    复制代码

     分治策略的应用,程序易懂易编写,不要说一个sort完事,这里是介绍算法不是介绍偷懒,不过我的版本在用随机数优化之前运行效率确实比不上sort....

    此算法的思想可用于求无序数列中第k大的数,时间复杂度为O(logn).

    2017年10月25日00:13:51 更新:

     1 #include<iostream>
     2 #include<ctime>
     3 #include<cmath>
     4 #include<cstdlib>
     5 using namespace std;
     6 
     7 void swp(int &a, int &b)
     8 { int c = a; a = b; b = c; }
     9 
    10 void Q_sort(int n[], int l, int r)
    11 {
    12     if(r <= l) return;  //递归结束条件 
    13     
    14     
    15     srand((unsigned)time(NULL));
    16     int mid = l + rand() % (r - l + 1);  // mid ->  1 + rand() % xxx -> l(LLLL!!!!) + rand() % xxx 
    17     swp(n[mid], n[r]);
    18     
    19     int j = r;
    20     
    21     for(int i = l; i < j; i++)    //[l, r] -> [l, j] // 边界冲突 ==> i < r -> i < j
    22         if(n[i] > n[r] && j >= l)
    23             swp(n[i], n[--j]), i--; //没法保证换到 [l, i]区间的来自[i, j]的值小于mid  e -> i--;
    24         
    25     swp(n[r], n[j]);
    26     
    27     
    28     Q_sort(n, l, j - 1);
    29     Q_sort(n, j + 1, r);
    30 }
    31 
    32 int main()
    33 {
    34     int N;
    35     cin >> N;
    36     int n[N];
    37     for(int i = 0; i < N; i++)
    38         cin >> n[i];
    39     
    40     Q_sort(n, 0, N-1);
    41     
    42     for(int i = 0; i < N; i++)
    43         cout << n[i] << " ";
    44     cout << endl;
    45     
    46     return 0; 
    47 }

    为什么要倒着写!!!!!

         |

         v

    -> px  <-

         ^

         |

  • 相关阅读:
    Table交替行变色 鼠标经过变色 单击变色
    编程专用字体(雅黑字体+Consolas)
    Enterprise Architect学习笔记-EA中关系
    通用分页存储过程
    解决vs2008无法切换设计视图
    盒子模式
    ASP.NET界面数据绑定大大杂烩
    Tyvj P1032 Begin2 Unit1 身份验证
    NOIP2010普及组T1
    TyvjBegin P1036 Begin2 Unit1 数独验证
  • 原文地址:https://www.cnblogs.com/QQ-1615160629/p/5852154.html
Copyright © 2011-2022 走看看