一.简介
有STL的sort了谁还手打啊?(bushi
快速排序在某一种程度上是极快的(好像有点怪?
二. 原理
何为快速排序?不就是就是SORT吗?但是手打出来还是很有必要的
快速排序本质上是一种分治算法
其原理是 把数组中一个数(可以随机)作为一个flag 把比它小的放在它右边把比它大的放在左边 然后我们再把这个数组分成两部分 在这两部分里 分别再找一个flag 再把这两个数组里面 小的大的分在两边。我们递归处理到底层 就可以把整个数组变成有序的。
三.代码
#include<bits/stdc++.h>
using namespace std;
int f[100000];
inline void quick_sort(int l,int r){
if(l>=r) return;
int spl=rand()%(r-l+1)+l;//随机化优化,确保随机spl在[l,r]的区间内
swap(f[l],f[spl]);
int flag=f[l];
int i=l,j=r;
while(i<j){
while(i<j&&f[j]>=flag) j--;
while(i<j&&f[i]<=flag) i++;
if(i==j) swap(f[i],f[l]);
else swap(f[i],f[j]);
}
quick_sort(l,i-1);
quick_sort(j+1,r);
}
int main(int argc,char** argv){
int sze;
cin>>sze;
for(register int i=1;i<=sze;i++) cin>>f[i];
quick_sort(1,sze);
for(register int i=1;i<=sze;i++) cout<<f[i];
return 0;
}
四.提醒
快速排序 的时间复杂度 是 O(nlogn) 最差情况下会 退化成 O(n^2)
如何优化?可以使用随机化 我们并不需要呆呆的每次都选择第一个作为 flag
随机化优化已经在代码里体现