SDUTOJ 2109 找女朋友 快速排序法 堆排序

找女朋友

Time Limit: 15MS Memory limit: 65536K

题目描述

山东理工大学有很多学生,当然也有很多美女,机械实验班的学委(外号:大王八)很想找个女朋友,但他想找个身高和自己相配的女生坐女朋友,现有理工大N个美女的身高数据,但由于N的值较大,为了尽快找到合适的女友,大王八想请你帮他完成这N个美女的身高排序,按降序排列。

输入

输入包括两行,第一行是一个正整数N(N<=1000000),表示理工大共N个美女。第二行有N个正整数分别表示N位美女的身高,每个正整数的值不会超过10^9。 (输入数据之间会用空格隔开)

输出

输出只有一行,为这N个数的降序序列,数与数之间用空格隔开。

示例输入

5
1 3 2 5 4

示例输出

5 4 3 2 1

提示

 

来源


只有15ms,没办法,快排,归并,堆排都行,这里用快排。。。。。

#include <stdio.h>
#include <stdlib.h>

int kp(int,int);
int dy(int,int);
 int a[1000010]={0};

int kp(int t,int w)
{
    int bj=0;
    bj=a[t];
    while(t<w)
    {
        while(t<w&&a[w]>=bj)
        {
            w--;
        }
        a[t]=a[w];
        while(t<w&&a[t]<=bj)
        {
            t++;
        }
        a[w]=a[t];
    }
    a[t]=bj;
    return t;
}
int dy(int l,int r)
{
    int fh=0;
    if(l>=r)
        return ;
    fh=kp(l,r);
    dy(l,fh-1);
    dy(fh+1,r);
}
int main()
{
    int i=0,n=0,l=0,r=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    dy(0,n-1);
    for(i=n-1;i>=0;i--)
    {
        printf("%d",a[i]);
        if(i>=1)
            printf(" ");
    }
    printf("\n");
    return 0;
}

总不能每次用到快排的时候都再敲一个模板吧 ..... 于是向大神求救,结果杭电的zyx大神发给我了一篇说明文章,看了后深有感触,和大家分享一下 ....

#include <algorithm>
#include <stdio.h>
#include <string.h>

using namespace std;

int s[1000010];

int main()
{
    int n=0,i=0;
    memset(s,0,sizeof(s));
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&s[i]);
    }
    sort(s,s+n);
    for(i=n-1; i>=0; i--)
    {
        printf("%d",s[i]);
        if(i>0)
            printf(" ");
    }
    printf("\n");
    return 0;
}

还有加排序法则的(cmp()函数):

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>


using namespace std;


int s[1000010];


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


int main()
{
    int n=0,i=0;
    memset(s,0,sizeof(s));
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&s[i]);
    }
    sort(s,s+n,cmp);
    for(i=0; i<n; i++)
    {
        printf("%d",s[i]);
        if(i<n-1)
            printf(" ");
    }
    printf("\n");
    return 0;
}



中间加了一个cmp函数,表示排序法则,sort在头文件algorithm中,用c++编译提交,还要加上using namespace std,否则编译不过。。。。。



学堆排序的时候用这个题做了测试,发一篇堆排序的代码:


#include <stdio.h>
#include <string.h>

int s[1000010];

void adjustheap(int len,int i)
{
    int l = i << 1;
    int r = i << 1 | 1;
    int mx = i;
    while(l <= len || r <= len)
    {
        if(l <= len && s[mx] > s[l])
            mx = l;
        if(r <= len && s[mx] > s[r])
            mx = r;
        if(i != mx)
        {
            int tmp = s[i];
            s[i] = s[mx];
            s[mx] = tmp;

            i = mx;
            l = mx << 1;
            r = mx << 1 | 1;
        }
        else
            break;
    }
}

void build(int len)
{
    for(int i = len >> 1;i >= 1;i--)
    {
        adjustheap(len,i);
    }
}

void heapsort(int n)
{
    while(n)
    {
        int tmp = s[1];
        s[1] = s[n];
        s[n] = tmp;
        n--;
        adjustheap(n,1);
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1;i <= n;i++)
    {
        scanf("%d",&s[i]);
    }
    build(n);
    heapsort(n);
    for(int i = 1;i <= n;i++)
    {
        printf("%d",s[i]);
        if(i < n - 1);
            printf(" ");
    }
    printf("\n");
    return 0;
}


堆排序的STL实现:

堆排序最快O(nlog n),最慢O(nlog n)哦。。。。。


#include <stdio.h>
#include <algorithm>

using namespace std;

int s[1000010];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 0;i < n;i++)
    {
        scanf("%d",&s[i]);
    }
    make_heap(s,s + n);//建立堆
    sort_heap(s,s + n);//堆排序
    for(int i = n - 1;i >= 0;i--)
    {
        printf("%d",s[i]);
        if(i > 0)
            printf(" ");
    }
    printf("\n");
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值