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