找女朋友
Time Limit: 15MS Memory limit: 65536K
题目描述
山东理工大学有很多学生,当然也有很多美女,机械实验班的学委(外号:大王八)很想找个女朋友,但他想找个身高和自己相配的女生坐女朋友,现有理工大N个美女的身高数据,但由于N的值较大,为了尽快找到合适的女友,大王八想请你帮他完成这N个美女的身高排序,按降序排列。
输入
输入包括两行,第一行是一个正整数N(N<=1000000),表示理工大共N个美女。第二行有N个正整数分别表示N位美女的身高,每个正整数的值不会超过10^9。 (输入数据之间会用空格隔开)
输出
输出只有一行,为这N个数的降序序列,数与数之间用空格隔开。
示例输入
5
1 3 2 5 4
示例输出
5 4 3 2 1
提示
来源
只有15ms,没办法,快排,归并,堆排都行,这里用快排。。。。。
#include <stdio.h>
#include <stdlib.h>
int kp(int,int);
int dy(int,int);
int a[1000010]={0};
int kp(int t,int w)
{
int bj=0;
bj=a[t];
while(t<w)
{
while(t<w&&a[w]>=bj)
{
w--;
}
a[t]=a[w];
while(t<w&&a[t]<=bj)
{
t++;
}
a[w]=a[t];
}
a[t]=bj;
return t;
}
int dy(int l,int r)
{
int fh=0;
if(l>=r)
return ;
fh=kp(l,r);
dy(l,fh-1);
dy(fh+1,r);
}
int main()
{
int i=0,n=0,l=0,r=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
dy(0,n-1);
for(i=n-1;i>=0;i--)
{
printf("%d",a[i]);
if(i>=1)
printf(" ");
}
printf("\n");
return 0;
}
总不能每次用到快排的时候都再敲一个模板吧 ..... 于是向大神求救,结果杭电的zyx大神发给我了一篇说明文章,看了后深有感触,和大家分享一下 ....
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
int s[1000010];
int main()
{
int n=0,i=0;
memset(s,0,sizeof(s));
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&s[i]);
}
sort(s,s+n);
for(i=n-1; i>=0; i--)
{
printf("%d",s[i]);
if(i>0)
printf(" ");
}
printf("\n");
return 0;
}
还有加排序法则的(cmp()函数):
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
int s[1000010];
int cmp(const int a,const int b)
{
return a>b;
}
int main()
{
int n=0,i=0;
memset(s,0,sizeof(s));
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&s[i]);
}
sort(s,s+n,cmp);
for(i=0; i<n; i++)
{
printf("%d",s[i]);
if(i<n-1)
printf(" ");
}
printf("\n");
return 0;
}
中间加了一个cmp函数,表示排序法则,sort在头文件algorithm中,用c++编译提交,还要加上using namespace std,否则编译不过。。。。。
学堆排序的时候用这个题做了测试,发一篇堆排序的代码:
#include <stdio.h>
#include <string.h>
int s[1000010];
void adjustheap(int len,int i)
{
int l = i << 1;
int r = i << 1 | 1;
int mx = i;
while(l <= len || r <= len)
{
if(l <= len && s[mx] > s[l])
mx = l;
if(r <= len && s[mx] > s[r])
mx = r;
if(i != mx)
{
int tmp = s[i];
s[i] = s[mx];
s[mx] = tmp;
i = mx;
l = mx << 1;
r = mx << 1 | 1;
}
else
break;
}
}
void build(int len)
{
for(int i = len >> 1;i >= 1;i--)
{
adjustheap(len,i);
}
}
void heapsort(int n)
{
while(n)
{
int tmp = s[1];
s[1] = s[n];
s[n] = tmp;
n--;
adjustheap(n,1);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%d",&s[i]);
}
build(n);
heapsort(n);
for(int i = 1;i <= n;i++)
{
printf("%d",s[i]);
if(i < n - 1);
printf(" ");
}
printf("\n");
return 0;
}
堆排序的STL实现:
堆排序最快O(nlog n),最慢O(nlog n)哦。。。。。
#include <stdio.h>
#include <algorithm>
using namespace std;
int s[1000010];
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
scanf("%d",&s[i]);
}
make_heap(s,s + n);//建立堆
sort_heap(s,s + n);//堆排序
for(int i = n - 1;i >= 0;i--)
{
printf("%d",s[i]);
if(i > 0)
printf(" ");
}
printf("\n");
return 0;
}