1045. 快速排序(25)
2015-10-30 14:11
253 查看
著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的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个空格分隔,行末不得有多余空格。
输入样例:
输出样例:
[/code]
例如给定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
----------------华丽的分割线----------------------
分析:主元需要满足条件:左边的数都比它小,右边的数都比它大
代码:
#include <stdio.h> #include <stdlib.h> #define Maxn 100001 typedef struct { int data; int flag; //用来标记是否为主元:1是,0否 }Num; Num input[Maxn]; int compare(const void *a,const void *b); int main(void) { int N,i; int sum = 0,count = 0; int max,min; scanf("%d",&N); for(i=0;i<N;++i) { scanf("%d",&(input[i].data)); input[i].flag = 1; } max = input[0].data; min = input[N-1].data; for(i=0;i<N;++i) { if(input[i].data >= max) max = input[i].data; else input[i].flag = 0; } for(i=N-1;i>=0;--i) { if(input[i].data <= min) min = input[i].data; else input[i].flag = 0; } for(i=0;i<N;++i) { if(input[i].flag == 1) ++sum; } qsort(input,N,sizeof(input[0]),compare); printf("%d\n",sum); if(sum>0) { for(i=0;i<N;++i) { if(input[i].flag == 1) { printf("%d",input[i].data); ++count; if(count != sum) printf(" "); if(count == sum) break; } } } printf("\n"); return 0; } int compare(const void *a,const void *b) { if((*(Num *)a).data == (*(Num *)b).data) return 0; else if((*(Num *)a).data < (*(Num *)b).data) return -1; else return 1; }
[/code]
相关文章推荐
- xcode对比两个分支中的同一个文件
- L版本添加新key的方法
- 浏览器的重绘与重排
- String、StringBuilder与StringBuffer
- 刨根问底U3D---从Profile中窥探Unity的内存管理
- 组织机构sql
- httpClient发送请求
- extern "C"的用法要点
- dataguard 中standby有大量gap解决方法
- zookeeper订阅与发布实现
- LeetCode---Construct Binary Tree from Inorder and Postorder Traversal
- 如何使用测试证书来生成越狱版的ipa包
- Android ADB命令大全(通过ADB命令查看wifi密码、MAC地址、设备信息、操作文件、查看文件、日志信息、卸载、启动和安装APK等)
- 主键乱序插入对Innodb性能的影响
- URL Regex expression
- vs2010下release版本调试设置
- 使用CocoaPods一直停留在:Updating local specs repositories
- 1044. 火星数字(20)
- 增加评论逻辑
- Django 源码小剖: 初探 WSGI