快速排序是对冒泡排序的一种改进,减少了比较和循环次数
基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分继续进行排序,以达到整个序列有序。
具体步骤:
1,将序列分为前后两部分,取序列的中间值为分割数记为mid,
2,升序排列时前一部分找比mid大的数,后一部分找比mid小的数,
3,判断两者的位置,符合要求两者交换,
4,观察排序是否到了边界,如果未到则递归分开搜索左右区间。
快速排序的时间复杂度(nlog2n)相较与冒泡排序来说要短。但是存在一定的不稳定性,可能时间复杂度能达到n的平方。
目前而言快速排序法还是被认为最好的一种排序方法。
具体见代码
#include<iostream>
using namespace std;
int s[100001];
void qsort(int l,int r)//将大的放在数组右边,将小的放在左边
{
int i=l,j=r;//下面的计算不能直接调用l与r,后面需要判断是否排序完成需要用到l r
int mid=s[(l+r)/2];//将当前序列的中间作为分隔数
do
{
while(s[i]<mid)
++i;//寻找左面大于中间数的数
while(s[j]>mid)
--j;//右面小于中间数的数
if(i<=j)//满足条件
{
swap(s[i],s[j]);//交换
++i,--j;
}
}
while(i<=j);//继续寻找不能上了等于号
if(j>l) qsort(l,j);//寻找到最后j==l 和i==r
if(i<r) qsort(i,r);//未到两个数的边界继续递归搜索左右区间
}
int main()
{
int n;
cin>>n;
cout<<"排序前:"<<endl;
for(int i=1;i<=n;++i)//下表表示位置,最好从1开始
cin>>s[i];
qsort(1,n);
cout<<"排序后"<<endl;
for(int i=1;i<=n;++i)
cout<<s[i]<<" ";
return 0;
}
运行结果