C++,快速排序【写出来的】

C++的各位,用sort应该很顺手了,它很方便。

特别是自己可以写个comp函数,排结构体这种类型的时候,就更方便了。

 

快排是必备的算法,自己写出来,才能更明白。

基本思想:选取枢轴,将一个完整序列分为左右两部分,通过一趟排序使得左子序列的值都小于右子序列的值。

再分别将左子序列和右子序列划分为左右两部分,分别进行排序。

 

具体做法:两个指针i,j,初始值为l,r。枢轴为mid。j从当前位置开始往前找第一个小于mid的记录,i从当前位置往后找第一个大于mid的记录,将两个值交换。重复该过程,指导i>j。

#include<iostream>
using namespace std;

void qsort(int,int);
int a[100005];

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]<<" ";
    return 0;
}

void qsort(int l,int r){
    int i,j,mid,tmp;
    i=l;
    j=r;
    mid=a[(l+r)/2];//mid枢轴设为当前序列中间位置的值 
    do{
    while(a[i]<mid) i++;//在左子序列找比mid大的记录 
    while(a[j]>mid) j--;//在右子序列找比mid小的记录 
    if(i<=j){//找到了两个需要交换的记录,交换
        tmp=a[i];
        a[i]=a[j];
        a[j]=tmp;
        i++;//i继续向后找 
        j--;//j继续向前找 
    }    
    }while(i<=j);
    if(l<j) qsort(l,j);//递归排序左子序列 
    if(i<r) qsort(i,r);//递归排序右子序列 
}
View Code

 

posted @ 2016-12-14 16:14  guesswhohia  阅读(283)  评论(0编辑  收藏  举报