[算法分析]
快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
一趟快速排序的具体做法是:附设两个指针i和j,它们的初值分别为l和r ,设枢轴记录取mid,则首先从j所指位置起向前搜索找到第一个关键字小于mid的记录,然后从i所指的位置起向后搜索,找到第一个关键字大于mid的记录,将它们互相交换,重复这两步直到i>j为止。
[参考代码]
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[101];
void qsort(int,int);//子函数在主函数之后编写,则需在主函数前先声明
int main()
{
int n,i;
cin>>n;
for(i=1;i<=n;i++)
cin>>a[i];
qsort(1,n);
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void qsort(int zuo,int you)
{
int i,j,mid,p;
i=zuo;j=you;
mid=a[(zuo+you)/2];
do
{
while(a[i]<mid)i++;//在左半部分寻找比中间数大的数
while(a[j]>mid)j--;//在右半部分寻找比中间数小的数
if(i<=j)//若找到一组与排序目标不一致的数对,则交换它们
{
p=a[i];a[i]=a[j];a[j]=p;
i++;j--;//继续找
}
}while (i<=j);//注意这里不能少了等号
if(zuo<j)qsort(zuo,j);//若未到两个数的边界,则递归搜索左右区间
if(i<you)qsort(i,you);
}
//快速排序的时间复杂性是o(nlog2n),速度快,但它是不稳定的排序方法。就平均时间而言,快速排序是目前被认为是最好的一种内部排序方法。
测试数据 8
36 25 48 12 65 43 20 58
重点理解 12 与 36 的交换,及第二轮执行 qsort(2,8)