PAT乙级--1045

该博客介绍了如何使用快速排序算法,并通过一个C++代码示例展示了如何在排序过程中找到序列中的主元。主元是指在排序过程中位置不变且其左侧没有更大值的元素。博客内容包括对原始数组的排序,以及利用排序后的数组来判断主元的过程。代码中使用了vector和数组两种数据结构,对比了它们的性能,并输出了主元的数量及其值。
摘要由CSDN通过智能技术生成

0、重点

  • 判断主元的重要方法是:对原序列sort排序,逐个⽐较,当当前元素没有变化并且它左边的所有值的最⼤值都⽐它⼩的时候就可以认为它⼀定是主元。

    1 3 2 4 5   //原数组
    1 2 3 4 5   //排序后数组
    
    可以看出1 4 5位置不变,是主元
    
    但是:
    5 4 3 2 1  //原数组
    1 2 3 4 5   // 排序后数组
    
    3的位置没变,但是不是主元,因为3前面有更大的,在排序时一定会变动。
    

    所以必须满足①位置不变;②左边没有更大的数才是主元

  • 当vector尺寸初始化后,可以通过scanf("%d",&a[i]);给vector a赋值

1、题目

1045 快速排序 (25 分)

2、代码

#include <iostream>
#include<vector>
#include<algorithm>

using namespace std;

int main(int argc, char **argv)
{
    int v[100000];	//数组比vector更快,vector的扩展很费时间
    int n,max=0,cnt=0;
    scanf("%d",&n);

    vector<int> a(n),b(n);

    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);      //scanf可以给vector赋值
        b[i]=a[i];
    }

    sort(a.begin(),a.end());

    for(int i=0;i<n;i++){       //一个trick:用max保存前面最大值,这样不用每次都和前面所有的元素作比较。
        if(a[i]==b[i] && b[i]>max) v[cnt++]=b[i];
        if(b[i]>max) max=b[i];
    }

    printf("%d\n",cnt);
    for(int i=0;i<cnt;i++){
        if(i!=0) printf(" ");
        printf("%d",v[i]);
    }
    printf("\n");   //按题目要求,第二行为顺序输出,当个数=0时,也要输出空行。所以个数!=0时用作换行,个数=0时用作输出空行


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是一个对称矩阵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值