快速排序详解

来源:互联网 发布:java的数据类型 编辑:程序博客网 时间:2024/06/18 04:28

[算法分析]

     快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

    一趟快速排序的具体做法是:附设两个指针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)

0 0