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  <-

     ^

     |

 

posted @ 2016-09-08 10:43  筱陌  阅读(171)  评论(0编辑  收藏  举报