poj2388——Who's in the Middle
来源:互联网 发布:男士脸型与发型知乎 编辑:程序博客网 时间:2024/06/05 04:57
题目大意:给出奇数个奶牛的产奶量,找出他们的中位数
输入:奶牛个数N (1 <= N < 10,000)
第i个奶牛的产奶量(1..1,000,000)
输出:中位数
分析:可以直接用sort函数,也可以用快排、归并、堆排序,但是注意不要用冒泡、选择排序、直接排序等时间复杂度为O(N²)的排序方法
代码:
直接sort转载自http://blog.csdn.net/riverflowrand/article/details/52594833
- #include <iostream>
- #include <algorithm>
- using namespace std;
- int n;
- int d[10005];
- int main() {
- while(cin >> n) {
- for(int i=0; i<n; i++)
- cin >> d[i];
- sort(d, d+n);
- cout << d[(n-1)/2];
- }
- return 0;
- }
1.快排:选数据第一个作为pivot,设两个指针i和j,i指向数据头不断向右移直到所指数据比pivot大,j指向数据尾不断向左移直到所指数据比pivot小,此时比较ij,如果i<j,则交换ij所指数据,否则就将j所指数据与pivot交换
- #include"iostream"
- #include"cstdio"
- #include"cstring"
- #define N 10010
- using namespace std;
- int data[N];
- int n;
- void quicksort(int left,int right)
- {
- if(left>=right) return ;
- else
- {
- int i=left;
- int j=right;
- int temp=data[left];
- while(i!=j)
- {
- while(i<j&&data[j]>=temp) j--;
- while(i<j&&data[i]<=temp) i++;
- if(i!=j)
- {
- int t=data[i];
- data[i]=data[j];
- data[j]=t;
- }
- }
- data[left]=data[i];
- data[i]=temp;
- quicksort(left,i-1);
- quicksort(i+1,right);
- return ;
- }
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++) scanf("%d",&data[i]);
- quicksort(1,n);
- printf("%d\n",data[(n+1)/2]);
- return 0;
- }
- #include"iostream"
- #include"cstdio"
- #include"cstring"
- #define N 10010
- #define inf 99999999
- using namespace std;
- int data[N];
- int n;
- void mergesort(int left,int mid,int right)
- {
- int n1=mid-left+1;
- int n2=right-mid;
- int s1[n1+2];
- int s2[n2+2];
- int i,j;
- for(i=left;i<=mid;i++) s1[i-left+1]=data[i];
- for(j=mid+1;j<=right;j++) s2[j-mid]=data[j];
- i=j=1;
- s1[n1+1]=s2[n2+1]=inf;
- for(int k=left;k<=right;k++)
- {
- if(s1[i]>s2[j]) data[k]=s2[j++];
- else data[k]=s1[i++];
- }
- }
- void merge(int left,int right)
- {
- if(left>=right) return ;
- else
- {
- int mid=(left+right)/2;
- merge(left,mid);
- merge(mid+1,right);
- mergesort(left,mid,right);
- }
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++) scanf("%d",&data[i]);
- merge(1,n);
- printf("%d\n",data[(n+1)/2]);
- return 0;
- }
- #include"iostream"
- #include"cstdio"
- #include"cstring"
- #define N 10010
- using namespace std;
- int data[N];
- int n;
- int heap[N];
- int heapnum;
- void swap(int x,int y)
- {
- int t=data[x];
- data[x]=data[y];
- data[y]=t;
- }
- void siftdown(int i)
- {
- int t;
- while(i*2<=heapnum)
- {
- if(data[heap[i]]>data[heap[i*2]]) t=i*2;
- else t=i;
- if(i*2+1<=heapnum&&data[heap[i*2+1]]<data[heap[t]]) t=i*2+1;
- if(i!=t)
- {
- swap(i,t);
- i=t;
- }
- else break;
- }
- }
- void heapsort()
- {
- for(int i=1;i<=n-1;i++)
- {
- swap(1,heapnum);
- heapnum--;
- siftdown(1);
- }
- }
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;i++)
- {
- scanf("%d",&data[i]);
- heap[i]=i;
- }
- heapnum=n;
- for(int i=n/2;i>=1;i--) siftdown(i);
- heapsort();
- printf("%d\n",data[(n+1)/2]);
- return 0;
- }
阅读全文
0 0
- poj2388——Who's in the Middle
- POJ2388——Who's in the Middle
- poj2388——Who's in the Middle
- Who's in the Middle POJ2388
- poj2388 Who's in the Middle
- POJ2388-Who's in the Middle
- POJ2388-Who's in the Middle
- 快速排序浅谈——(解题报告)HDU1157和POJ2388---Who's in the Middle
- POJ2388 Who's in the Middle 快排
- POJ2388《Who's in the Middle》方法:排序
- Who's in the Middle poj2388 vector 水题
- poj2388 Who's in the Middle 快排
- POJ2388 HDU1157 Who's in the Middle【中位数+排序】
- Who's in the Middle(poj2388 排序)
- HDU—— 1157 Who's in the Middle
- HDU --1157 Who's in the Middle——nth_element
- Who's in the Middle
- Who's in the Middle
- Mvp+Okhttp+Event 传值
- dedecms模板中dedeajax2.js导致网页无法打开
- Java charAt() 方法
- 利用Python3爬取百度贴吧
- 对串 旋转字符串
- poj2388——Who's in the Middle
- Fedora 27 添加rpmfusion源
- viewpager+fragment左右滑动切换页面
- struts2_day02_15-封装数据到list集合_16-封装数据到map集合
- 了解Event Loop
- Java 对称加密
- 你指定的文件名有问题,无法创建文件的解决方法
- PageFactory.initElements方法
- Fatal error: Call to a member function..的解决方法