1045 快速排序 (25分)

著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的 N 个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?
例如给定 N = 5 N = 5 N=5, 排列是1、3、2、4、5。则:

  • 1 的左边没有元素,右边的元素都比它大,所以它可能是主元;
  • 尽管 3 的左边元素都比它小,但其右边的 2 比它小,所以它不能是主元;
  • 尽管 2 的右边元素都比它大,但其左边的 3 比它大,所以它不能是主元;
  • 类似原因,4 和 5 都可能是主元。

因此,有 3 个元素可能是主元。

输入格式:

输入在第 1 行中给出一个正整数 N(≤10​5​​); 第 2 行是空格分隔的 N 个不同的正整数,每个数不超过 10​9​​。

输出格式:

在第 1 行中输出有可能是主元的元素个数;在第 2 行中按递增顺序输出这些元素,其间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

5
1 3 2 4 5

输出样例:

3
1 4 5

很有意思的一道题,看似简单,实际用一般的暴力方法一定会超时。

其实,该题只要比较该元素是否排完序后的该元素在同一位置(a[i]==b[i]),并且大于之前的所有元素(a[i]>max)即可。

样例解答(java):

不过java依旧会超时啊哈哈。

import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) throws Exception{Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();String[] s = sc.nextLine().split(" ");int[] a = new int[n];int[] b = new int[n];int[] sum = new int[n];int num=0,max=0;for(int i=0;i<n;i++) {a[i]=Integer.parseInt(s[i]);b[i]=a[i];}Arrays.sort(b);for(int i=0;i<n;i++) {if(a[i]==b[i]&&a[i]>max) {sum[num++]=a[i];}if(a[i]>max) {max=a[i];}}System.out.println(num);for(int i=0;i<num;i++) {System.out.print(sum[i]);if(i!=num-1) System.out.print(" ");}}
}

样例解答(c++):

#include <bits/stdc++.h>
using namespace std;int main() {int n;cin>>n;int a[n],b[n],sum[n],max=0,num=0;for(int i=0;i<n;i++) {cin>>a[i];b[i]=a[i];}sort(b,b+n);for(int i=0;i<n;i++) {if(a[i]==b[i]&&a[i]>max) {sum[num++]=a[i];}if(a[i]>max) {max=a[i];}}cout<<num<<endl;for(int i=0;i<num;i++) {cout<<sum[i];if(i!=num-1) cout<<" ";}//结束时要换行,不然第二个点过不去 cout<<endl;
}

PTA 快速排序(java/c++)相关推荐

  1. 【PTA】JAVA提交的一些注意点

    在PTA提交Java程序需要注意如下几个要点: 文章目录 0. 不要包含package关键字 1. Main类与Scanner 1.1 Main类 1.2 使用Scanner处理输入 2.Scanne ...

  2. 快速排序 Java模板

    快速排序Java模板 详情参考 https://www.acwing.com/problem/content/787/ https://www.acwing.com/solution/content/ ...

  3. 快速排序Java实现

    快速排序Java实现 快速排序是一种分治的排序算法,将一个数组分成两个数组,将两部分独立地排序.一般策略是先取基准元素,又称切分元素,从数组右边开始向左扫描直到找到一个不大于它的元素填入到右边的坑内, ...

  4. 快速排序java代码_8 种排序算法与 Java 代码实现!

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

  5. 快速排序 java导包_排序算法-快速排序(Java实现)

    上篇我们讲了冒泡排序,这次我们讲它的升级版快速排序,"快速",一看就是个好算法~ 快速排序(QuickSort)是啥? 我们先看下百度百科的介绍快速排序(Quicksort)是对冒 ...

  6. 冒泡排序、快速排序 java代码实现

    文章目录 冒泡排序 源码实现 单元测试 优化 快速排序 源码实现 单元测试 冒泡排序 源码实现 package csdn.dreamzuora.sort;import java.util.List;/ ...

  7. 快速排序 java代码_java实现快速排序

    一:快速排序的特征 1:冒泡排序的改进 2:内部交换数据 3:分治+递归的思想 4:稳定排序 5:时间复杂度为:O(n*logn) 二:算法的整体思路 1:原始数据:12 11 6 87 23 8 5 ...

  8. 快速排序 java cutoff_排序之 快速排序

    采用算法导论上的实现方式,用java实现. 快排算法核心的部分便是partition过程,这里的partition采取最后一个元素作为pivot,i和j两个指针都从头向后扫描,如下图所示,数组被分为4 ...

  9. 玩转二叉链表 PTA(JAVA)

    设计程序,按先序创建二叉树的二叉链表:然后先序.中序.后序遍历二叉树. 输入格式: 按先序输入一棵二叉树.二叉树中每个结点的键值用字符表示,字符之间不含空格.注意空树信息也要提供,以#字符表示空树. ...

最新文章

  1. java中如何应对读改写场景
  2. 细品经典:LeNet-1, LeNet-4, LeNet-5, Boosted LeNet-4
  3. php 获取企业号用户,微信企业号 获取用户信息(示例代码)
  4. mysql导入存储过程报错_mysql导入建立存储过程或函数报错This function has none of DETERMINISTIC, NO SQL解决办法...
  5. 保险极客CTO叶晖谈企业团体险的星辰大海
  6. 笔记本电脑如何强制关机_笔记本按电源按钮不能关机只是关闭屏幕的解决办法...
  7. Linux系统下安装Mysql数据库
  8. 老程序员为什么从不使用 Java 自带的序列化?
  9. 与孩子一起学编程07章
  10. mipad1小米平板1刷LOS神盾系统16睡死问题排查(一)
  11. 华为HCNE考试110个知识点
  12. SpringBoot MultipartResolver的坑
  13. OneDrive无法登陆正常使用 There was a problem connecting to onedrive
  14. VRchat上传角色error无法保存蓝图解决
  15. 你的名字烂大街了吗?数据揭开国人起名背后的秘密……
  16. 猿创征文|unity中的MVC编程思想基础
  17. 弹性模量、刚度、强度、硬度_51CAE_新浪博客
  18. 小程序时代的来临,另一个战场的开启
  19. log4net 配置文件相对路径配置
  20. How to Use UMAP

热门文章

  1. 2021年化工自动化控制仪表试题及解析及化工自动化控制仪表操作证考试
  2. 搭建webservice环境,测试本地WSDL接口
  3. 22西北大学网络和数据中心软件专硕845考研上岸备考经
  4. Speedoffice(word)如何输入特殊符号?
  5. htmltd文本自动换行,完美解决table中td里面的内容自动换行
  6. 【转】.net 在线播放各类视频
  7. 魔兽世界怀旧服服务器最多多少人,魔兽世界怀旧服有多少人?怀旧服人口普查一览...
  8. 如何在pdf文件里批量添加文字
  9. ConvNeXt V2实战:使用ConvNeXt V2实现图像分类任务(一)
  10. 5.12五岁小童被救失踪 崩溃母亲人肉搜索寻子[转贴]