浅谈快速排序
快速排序(Quicksort)
1.定义
快速排序是对冒泡排序的一种改进算法。
2.基本思路
快速排序的思路大概就是在冒泡排序的基础之上增添了二分的思想。
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
简而言之:将一个序列分成两份,一份中的所有数比另外一份中的任何一个数大,重复操作直到序列有序。
3.应用思路
假设有一个等待排序的序列 $ {a[l],a[l+1],a[l+2].....a[r]} $
1.选定分界值
首先设定一个分界值,将这个序列分为两个部分
2.排序
将大于或等于分界值的数放在数组右边,小于分界值的数放在到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
3."套娃"
此时开始"套娃",对左边和右边分解完的序列再次进行重复操作,递归(套娃)下去直到序列有序即可。
3.代码实现
当然不是这个啦(雾,stl大法好
#include<bits/stdc++.h>
using namespace std;
int n,a[110];
void quicksort(int l,int r){
sort(a+l,a+l+r);
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
quicksort(1,n);
for(int i=1;i<=n;++i){
printf("%d ",a[i]);
}printf("\n");
return 0;
}
下面这个代码要想过 $ luogu $要改一改,自己看吧
#include<bits/stdc++.h>
using namespace std;
int n,a[100010];
void quicksort(int l,int r){
int i,j;
i=l,j=r;
int mid=a[l+r>>1];
do{
while(a[i]<mid) i++;
while(a[j]>mid) j--;
if(i<=j){
swap(a[i],a[j]);
i++;j--;
}
}while(i<=j);
if(l<j) quicksort(l,j);
if(i<r) quicksort(i,r);
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&a[i]);
}
quicksort(1,n);
for(int i=1;i<=n;++i){
if(i<n) printf("%d ",a[i]);
}printf("\n");
return 0;
}
4.讲在最后
快速排序的时间复杂度为 $ O(nlog_n) $ ,这是一个不稳定的算法,同样的时间复杂度的情况下,归并排序则是稳定的,归并排序可以说是排序算法中最优的一种了。
事实上,作为一名c++选手,平时一般都不会这样写, $ sort $ 多香啊,并且 $ sort $ 由于其内部具体原因,其稳定性可以得到保证,甚至可超越 $ O(nlog_n) $
如果想了解更多关于 $ sort $ 的芝士可以看一下这篇洛谷日报