首页 > 编程语言 > 详细

1045 快速排序 (25 分)

时间:2019-08-14 17:21:41      阅读:89      评论:0      收藏:0      [点我收藏+]

题目:1045 快速排序 (25 分)

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

例如给定 $N = 5$, 排列是1、3、2、4、5。则:

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

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

输入格式:

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

输出格式:

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

输入样例:

5
1 3 2 4 5

输出样例:

3
1 4 5

思路:

  • 此题必须抓住快速排序的特点,硬算的话一定会超时,因为最坏情况都是105,硬算两个循环就1010了。上万的循环其实都很慢了。
  • 快速排序中选择的主元排序后位置是不变的, 但是满足这个条件不一定是主元。例如:3 2 1 4 5中的2在排序前后位置不变,但明显不是主元。
    针对这种情况需要加以另外的判断:它还必须是当前序列此位置之前的序列的最大值。

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cctype>
 4 #include <iostream>
 5 #include <sstream>
 6 #include <cmath>
 7 #include <algorithm>
 8 #include <string>
 9 #include <stack>
10 #include <queue>
11 #include <vector>
12 #include <map>
13 using namespace std;
14 
15 int main()
16 {
17     int n;
18     int num[100005], nst[100005];
19     scanf("%d", &n);
20     for(int i = 0; i < n; i++)
21     {
22         scanf("%d", &num[i]);
23         nst[i] = num[i];
24     }
25     sort(nst, nst + n);
26     int cnt = 0, maxx = 0;
27     int zy[100005];
28     for(int i = 0; i < n; i++)
29     {
30         if(num[i] > maxx)
31             maxx = num[i];
32         if(num[i] == nst[i] && num[i] == maxx)    //如果排序后位置没变,而且是初位到当前位置的最大值,则确定是主元
33             zy[cnt++] = num[i];        
34     }
35     printf("%d\n", cnt);
36     for(int i = 0; i < cnt; i++)
37     {
38         printf("%d", zy[i]);
39         if(i != cnt-1)
40             printf(" ");
41     }
42     printf("\n");
43     return 0;
44 }

 

总结:

  凡是碰到有关的概念,出现过的,要好好想想其定义和原理以及特点。比如1045的快排,和前面题目出现过的插入和归并排序。
  此类题型要抓住特点解题。

1045 快速排序 (25 分)

原文:https://www.cnblogs.com/Anber82/p/11353212.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!