1045. 快速排序(25)

1045. 快速排序(25)

这里两种方式解析

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

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

 

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

     

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

    输入格式:

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

    输出格式:

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

    输入样例:
    5
    1 3 2 4 5
    
    输出样例:
    3
    1 4 5

 

一、简单粗暴法:

例:

原给定数组:

数组a:    2 5 3 8 7 4 9

经从小到大排序后的数组:

数组b:  2 3 4 5 7 8 9

数组下标不变的就是所求主元数:

数组c:  2 7 9

代码如下:

 1 #include <iostream> 
 2 #include <algorithm> 
 3 #include <stdio.h> 
 4 using namespace std; 
 5 
 6 int main() 
 7 { 
 8 int i,N; 
 9 int a[100001],b[100001];
10 int count=0,max=0; 
11 int c[100001];
12 scanf("%d",&N);
13 for(i=0;i<N;i++) 
14 { 
15 scanf("%d",&a[i]); 
16 b[i]=a[i]; 
17 } 
18 sort(b,b+N); //排序
19 
20 for(i=0;i<N;i++) 
21 { 
22 if(a[i]>max) 
23 max=a[i]; 
24 if(max==a[i] && a[i]==b[i]) 
25 c[count++]=a[i]; //数组c下标
26 } 
27 printf("%d\n",count); 
28 
29 for(i=0;i<count;i++) 
30 if(i==0) 
31 printf("%d",c[i]); 
32 else 
33 printf(" %d",c[i]); 
34 printf("\n"); 
35 return 0; 
36 }

 

二、最大比较法

例:

原给定数组:

数组a:    2 5 1 8 7 4 9

第一行:2 中最2大的  max_i=0

第二行:2 5 中5最大  max_i=1

第三行:2 5 1 中5最大,而1比之前的最大数2还小  max_i为没有值,以此为界限重新开始

第四行:8 中8最大  max_i=0

第五行:8 7 中8最大  max_i=1

第六行:8 4 中8最大  max_i=1

第七行:8 9 中9最大  max_i=2

 

最大的数是 8 9

按数组下标输出即可

代码如下:

 1 #include <iostream> 
 2 using namespace std; 
 3 
 4 int main() 
 5 { 
 6 int N; 
 7 cin>>N; 
 8 int i = 0 , max = 0 , max_i = 0; 
 9 int a[100000] = {0}; 
10 int n; 
11 for (i ; i < N; i++) 
12 { 
13 scanf("%d",&n); 
14 if (n > max) 
15 { 
16 max=n;
17 a[max_i] = n; 
18 max_i++; 
19 }else
20 { 
21 int j = 0; 
22 for ( j = max_i-1; j >=0 ; j--) 
23 { 
24 if (a[j] > n) 
25 { 
26 a[j] = 0; 
27 max_i--; 
28 } 
29 else 
30 { 
31 max_i = j+1; 
32 break; 
33 } 
34 } 
35 
36 } 
37 } 
38 cout<<max_i<<endl; 
39 if (max_i != 0) 
40 { 
41 for (i = 0 ; i < max_i-1 ; i++) 
42 cout<<a[i]<<' '; 
43 cout<<a[i]<<endl; 
44 } 
45 else 
46 cout<<endl; 
47 system("pause");
48 return 0;
49 }

 

posted @ 2017-09-07 19:53  mishalyin  阅读(173)  评论(0编辑  收藏  举报