P1045 快速排序

转跳点:

1045 快速排序 (25分)

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

例如给定 $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

这道题实现起来并不难,但是吧,时间复杂度的控制是一个很麻烦的事情。

我AC的思路如下:

对原序列sort排序,逐个比较,若当前元素没有变化并且它左边的所有值的最大值都比它小的时候就可以认为它一定是主元(很容易证明正确性的,毕竟无论如何当前这个数要满足左边都比他小右边都比他大,那它的排名一定不会变)~

说白了就是找区间最大值(只不过我这里利用了之前比较的结果),如果前面的都比当前元素小那么,它的比左边都大就成立了,如果他还比右边小那么,肯定是主元。如果 右边比区间最大值小,那么记下来区间最大值,从从这个值开往后,如此往复就得出答案啦

AC代码:

#include <stdio.h>
#include <stdlib.h> int cmp(const void *a, const void *b) { return *(int *)a > *(int *)b; } int main()
{
int n, max = 0, count = 0;
scanf("%d", &n);
int a[n], b[n], cn[n]; for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
cn[i] = a[i];
} qsort(cn, n, sizeof(cn[0]), cmp); for (int i = 0; i < n; i++)
{
if (a[i] > max)
{ //右边有比ta大的直接替换
max = a[i];
}
if (max == a[i] && a[i] == cn[i])
{ //左边所有值的最大值为当前元素 && 如果排序前后位置没变
b[count++] = a[i];
}
} printf("%d\n", count); if (0 == count)
{
printf("\n");//这是个坑,么得主元输出空行
return 0;
} for (int i = 0; i < count; i++)
{
printf("%d%s", b[i], i == count - 1 ? "" : " ");
} return 0;
}

我又看了一些博客,说什么快速排序前后主元位置不变……人家快排都不稳定好不好……

例如序列3 2 1 4 5,排序后,是1 2 3 4 5,通过比较主元为2 4 5,一看就是错的lo,2肯定不是主元啦~

快速排序重新排序后,与原序列比较,位置不变的元素,只是有可能是主元,也会混入非主元元素的啦~

所以:

主元一定包含在了排序后位置不变的元素中,但位置不变的元素不一定是主元。

PTA不易,诸君共勉!

P1045 快速排序的更多相关文章

  1. [C#][算法] 用菜鸟的思维学习算法 -- 马桶排序、冒泡排序和快速排序

    用菜鸟的思维学习算法 -- 马桶排序.冒泡排序和快速排序 [博主]反骨仔 [来源]http://www.cnblogs.com/liqingwen/p/4994261.html  目录 马桶排序(令人 ...

  2. 算法与数据结构(十六) 快速排序(Swift 3.0版)

    上篇博客我们主要聊了比较高效的归并排序算法,本篇博客我们就来介绍另一种高效的排序算法:快速排序.快速排序的思想与归并排序类似,都是采用分而治之的方式进行排序的.快速排序的思想主要是取出无序序列中第一个 ...

  3. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  4. 排序算法----调用库函数qsort进行快速排序

    功 能: 快速排序 头文件:stdlib.h 用 法: void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const ...

  5. Html5 快速排序演示

    快速排序(Quicksort)是对冒泡排序的一种改进.快速排序由C. A. R. Hoare在1962年提出. 它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另 ...

  6. Java 快速排序两种实现

    快速排序,只要学习过编程的人肯定都听说过这个名词,但是有时候写的时候还真蒙住了,网上搜罗了下以及查阅了"introduction to algorithm",暂时找到两种实现快排的 ...

  7. java基础算法之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...

  8. PAT 1045. 快速排序(25)

    著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边. 给定划分后的N个互不相同的正整数的排列,请问有多 ...

  9. 快速排序中的partition函数的枢纽元选择,代码细节,以及其标准实现

    很多笔试面试都喜欢考察快排,叫你手写一个也不是啥事.我很早之前就学了这个,对快速排序的过程是很清楚的.但是最近自己尝试手写,发现之前对算法的细节把握不够精准,很多地方甚至只是大脑中的一个映像,而没有理 ...

随机推荐

  1. Codeforces Round #586 (Div. 1 + Div. 2)E(拓扑排序,思维)

    #include<bits/stdc++.h>using namespace std;int n,m,s; vector<int>edge[200007];queue<i ...

  2. Webshell免杀研究

    前言 不想当将军的士兵不是好士兵,不想getshell的Hacker不是好Hacker~有时候我们在做攻防对抗时经常会碰到可以上传webshell的地方,但是经常会被安全狗.D盾.护卫神.云锁等安全软 ...

  3. 61二叉搜索树的第k个结点

    题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路:二叉搜索树的中序遍历是递增的序列,使用 ...

  4. Django 学习之内置Admin

    一.Admin组件 Django内置的Admin是对于model中对应的数据表进行增删改查提供的组件,使用方式有: Django Admin内部依赖: 依赖APP: django.contrib.au ...

  5. 设计模式课程 设计模式精讲 12-2 适配器模式coding

    1 重要 1.1 类适配器和对象适配器最大的区别 2 代码演练 2.1 代码演练1(类适配器模式) 2.2 代码演练2(对象适配模式) 2.3 代码演练3(具体应用场景) 1 重要 1.1 类适配器和 ...

  6. 如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南)

    如何:使用 as 和 is 运算符安全地进行强制转换(C# 编程指南) 由于对象是多态的,因此基类类型的变量可以保存派生类型.若要访问派生类型的方法,需要将值强制转换回该派生类型.不过,在这些情况下, ...

  7. jqGrid一次性读取本地数据

    参考:http://blog.sina.com.cn/s/blog_54da57aa010154r7.html

  8. vbox虚拟机vdi文件用VMware打开

    转自:https://blog.51cto.com/dahui09/1863486 方法一: 使用VirtualBox 自带的VBoxManage来进行格式转换: 1.安装VBoxManage 2.使 ...

  9. input 数值框处理

    <input type="text"> input  若设置type=“number” ,再想对其调用处理的函数是不起作用的,为此,首先将其设为文本类型 当前要求是数字 ...

  10. Django 3.0的新功能

    谷歌翻译的,我修正并且添加了一些内容.凑合看吧. MariaDB的支持 Django现在正式支持MariaDB 10.1和更高版本.有关更多详细信息,请参见MariaDB注释. ASGI支持 Djan ...