HDU1425快速排序

写本篇的目的是防止自己再忘了快排的原理和代码的实现,好长时间都没编,竟然不会了,O__O"…,并且还有在C++中的快排的库函数的应用,以供以后参考。

看了网上大牛的解释,受益匪浅,快排一般说是分治法,实际上在分治以前还有一个步骤,就是初步排序。以从大到小为例,我学习的是在给定的一组数中,以第一个为基准,找比基准大的数,依次放在基准数的后面,直到找不到比基准数大的数为止,并且记下最后一个比基准大的数的下标,交换基准与最后一个比基准大的数的位置,从而得到在基准以前的都比基准大,以后的都比基准小,这样初步排序就完成了。接下来就是分治,就是重复递归调用本函数排基准以前的,和基准以后的,结束的条件是区间两端相等,这样快速排序就完成了。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000010;
int a[maxn];

void qsort(int st,int ed)
{
    int t;
    int flag=st;
    if(st>=ed)return ;
    for(int i=st,j=st+1;j<=ed;j++)//基准是a[1];
    {
        if(a[j]>a[st])//如果找到了比a[1]大的数a[j]
        {
            i++;
            t=a[j];
            a[j]=a[i];//就把a[j]放在a[st]的后面
            a[i]=t;
            flag=i;//标记最后一个比a[st]大的数
        }
    }
    t=a[st];//交换基准和最后一个比基准大的数大的数
    a[st]=a[flag];
    a[flag]=t;
    qsort(st,flag-1);//分治递归
    qsort(flag+1,ed);
    return ;
}

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        qsort(1,n);
        for(int i=1;i<=m;i++)
        {
            if(i>1)printf(" ");
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}

用C++库函数的排序:(sort)
sort这个函数就是标准库中的快速排序,使用方法:在C++中加一个头文件#include<algorithm>  (学c的同学可以在c的基础上加上C++的头文件#include<iostream>   加上#include<algorithm>   加上using namespace std;   就行了,如下代码,实际上在C++中#include<stdio.h>和#include<cstdio>是一样的),再调用函数sort(a,a+n)   其中a表示你所用数组的首地址(如果没学指针的话,就记住行了),a+n表示要排的末尾,就是对从数组a[0]到a[n-1]的所有数排序,如果想从a[1]到a[n]的话,就写成sort(a+1,a+n+1)就行了。如果你想让它从大到小排序的话,还需要自己编一个cmp函数:

int cmp(int a,int b)
{
    return a>b;
}

并且sort要写成:sort(a,n,cmp);   这样你就不用自己编啦~\(≧▽≦)/~

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1000010;
int a[maxn];

int cmp(int a,int b)
{
    return a>b;
}

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=m;i++)
        {
            if(i>1)printf(" ");
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}

 

 

最后吐槽一下,以前一直以为调用qsort是快排,sort就是普通排序,但刚试了一下,反而是sort 快,问了一下学长,原来qsort是自己编的并且用了sort的,所以一般是用sort 的,但在这里也记一下qsort的用法。
要用头#include<algorithm>,从小到大排序,从a[0]到a[n-1]排序:qsort(a,n,sizeof(a[0]),cmp);  还得自己编一个cmp函数:

int cmp(const void *a,const void *b)
{
    return (*(int *)a-*(int *)b);
}

 

如果想从大到小,从a[1]到a[n]的话,就写成qsort(a+1,n,sizeof(a[1]),cmp);     并且把cmp函数中返回的ab调换:

int cmp(const void *a,const void *b)
{
    return (*(int *)b-*(int *)a);
}

总算写完了。。。。希望能给迷茫的童鞋帮助。

posted @ 2013-08-01 17:21  拼搏今朝 努力奋进  阅读(891)  评论(0)    收藏  举报