胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。
输入格式:
输入首先给出两个正整数N(≤10
6
)和M(≤10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。
输出格式:
在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。
输入样例:
8 3
8 12 7 3 20 9 5 18
输出样例:
20 18 12**
//该方法有一个测试点运行超时,算法有待简化
#include<stdio.h>
#include<string.h>
int main(void) {
int n,m,a[1000009],i,j,t=0,item,max;
scanf ("%d %d",&n,&m);
for (i=0;i<n;i++) {
scanf ("%d",&a[i]);
}
for (i=0;i<n;i++) {
max = i;
for (j=i+1;j<n;j++) {
if (a[j]>a[max]) {
max = j;
}
}
item = a[max];
a[max]=a[i];
a[i]=item;
}
for (i=0;i<m;i++) {
if (i!=0) printf (" ");
printf ("%d",a[i]);
}
return 0;
}
//简化后的方法如下:
#include<stdio.h>
#include<string.h>
int main(void) {
int i,j,k,n,m,a[1000],max[1000]; //用max[1000]数组来存放第1,2到(m-1)大的富翁财富
scanf ("%d %d",&n,&m);
for (i=0;i<m;i++) {
max[i]=0; //初始化,让所有的m个富翁财富都先为0
}
for (i=0;i<n;i++) {
scanf ("%d",&a[i]); //输入
for (j=0;j<m;j++) {
if (a[i]>max[j]) { //进行比较,找到a[i]位于第几大的位置
if (j==m-1) { //情况1:a[i]位于需要找的最后一个富翁的位置,因为不用往推了,就直接把a[i]的值给max[m-1]就行了
max[j]=a[i];
break;
}
else {
for (k=m-1;k>j;k--) { //情况2:a[i]不位于最后一个富翁位置,需要往后一次推一个位置,直到把第j大 富翁的位置让出来为止
max[k]=max[k-1];
}
max[j]=a[i]; //把a[i]给让出来的第j大 富翁的位置
break;
}
}
}
}
if (n>=m) //当让找的m个富翁在合理范围之内
for (i=0;i<m;i++) {
if (i!=0) printf (" ");
printf ("%d",max[i]);
}
else //当让找的m个富翁不在合理范围之内,就只能把仅有的n个富翁给输出来了
for (i=0;i<n;i++) {
if (i!=0) printf (" ");
printf ("%d",max[i]);
}
return 0;
}
建最大堆做的:
#include<stdio.h>
#include<stdlib.h>
#define MAXDATA 10000000
#define MaxSize 10000
typedef struct Node * MaxHead;
typedef int ElementType;
struct Node{
ElementType Data[MaxSize];
int Size;
};
MaxHead CreateMaxHeap ();
void Insert (int x);
int Delete ();
MaxHead BT;
int n;
int main(void){
int m,i,j,x;
scanf ("%d %d",&n,&m);
BT=CreateMaxHeap ();
for (i=0;i<n;i++) {
scanf ("%d",&x);
Insert (x);
}
if (n<m) m=n;
for (i=0;i<m;i++) {
x = Delete ();
if (i!=0) printf (" ");
printf ("%d",x);
}
return 0;
}
MaxHead CreateMaxHeap () {
BT = (MaxHead)malloc(sizeof (struct Node));
BT->Size=0;
BT->Data[0]=MAXDATA;
return BT;
}
void Insert (int x) {
int item,i;
if (BT->Size==0) {
BT->Data[1]=x;
}
else {
BT->Data[BT->Size+1] = x;
for (i=BT->Size+1;x>BT->Data[i/2];i=i/2) {
item = BT->Data[i];
BT->Data[i]=BT->Data[i/2];
BT->Data[i/2]=item;
}
}
BT->Size++;
}
int Delete () {
int y,x,parent,child,item;
x = BT->Data[1];
BT->Data[1] = BT->Data[BT->Size];
for (parent=1;parent*2<BT->Size;parent=child) {
child=parent*2;
if (BT->Data[child]<BT->Data[child+1]) child++;
if (BT->Data[parent]>BT->Data[child]) break;
else {
item = BT->Data[parent];
BT->Data[parent]=BT->Data[child];
BT->Data[child]=item;
}
}
BT->Size--;
return x;
}
用堆排序做的(,这里没有建n个结点的堆,而是通过直接建m个结点的堆,对于大数据能省好多时间的),代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node * MinHeap;
struct Node{
int Data[1000000];
int Size;
};
void CreateMinHeap(int n);
void Insert(int x);
MinHeap dui;
int main(void){
int n,m,i,j,x,t,p,h,w;
scanf ("%d %d",&n,&m);
if (m>n) m=n;
CreateMinHeap(n);
for (i=0;i<m;i++) {
scanf ("%d",&x);
Insert(x);
}
for (i=m;i<n;i++) {
scanf ("%d",&x);
if (x>dui->Data[1]) {
dui->Data[1]=x;
dui->Size=0;
for (j=1;j<=m;j++) {
Insert(dui->Data[j]);
}
}
}
/*for (i=1;i<=m;i++) {
printf ("%d ",dui->Data[i]);
}
printf ("\n");*/
for (i=m;i>0;i--) {
p=dui->Data[1];
dui->Data[1]=dui->Data[dui->Size];
dui->Data[dui->Size]=p;
dui->Size--;
h=dui->Size;
dui->Size=0;
for (j=1;j<=h;j++) {
Insert(dui->Data[j]);
}
}
/*if (m<n) w=n-m;
else w=n-1;
for (t=0;t<w;t++) {
p=dui->Data[1];
dui->Data[1]=dui->Data[dui->Size];
dui->Data[dui->Size]=p;
dui->Size--;
h=dui->Size;
dui->Size=0;
if (h==m) break;
for (i=1;i<=h;i++) {
Insert(dui->Data[i]);
}
/*for (j=1;j<=h;j++) {
printf ("%d ",dui->Data[j]);
}
printf ("\n");*/
for(i=1;i<=m;i++) {
if (i!=1) printf(" ");
printf ("%d",dui->Data[i]);
}
return 0;
}
void CreateMinHeap(int n){
dui=malloc(sizeof (struct Node));
dui->Size=0;
dui->Data[0]=-9999999;
}
void Insert(int x) {
int item,i;
if(dui->Size==0) {
dui->Data[1]=x;
}
else {
dui->Data[dui->Size+1]=x;
for (i=dui->Size+1;x<dui->Data[i/2];i=i/2) {
item=dui->Data[i];
dui->Data[i]=dui->Data[i/2];
dui->Data[i/2]=item;
}
}
dui->Size++;
}