9 6 一共九个数找第六大的数
6 7 5 2 3 4 1 9 8 这里给出9个数
第一种先排序在输出数组中第k-1个数就是第k个最大值
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n,temp,j,k,K;
scanf("%d %d",&n,&K);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]<a[j])
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}//选择排序
printf("%d",a[K-1]);
return 0;
}
第二种就是先把k个数读进去排序,然后在一个一个读后面的数,如果后面的数小于第k个那就不用管,要是大于第k个就把第k个去掉然后把这个数插入适当的位置。
#include <stdio.h>
#include <stdlib.h>
void xzpx(int a[],int n)//这个函数为选择排序
{
int i,temp,k,j;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]<a[j])
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}//选择排序
}
int df(const int a[],int n,int x)//这个函数是对分查找(对于排好序的数组每次取一半查找比一个个查要快一点,这个是昨天学习到的嘿嘿)。
{
int low ,high,mid;
low=0;
high=n-1;
while(1)
{
mid=(low+high)/2;
if(a[mid]>x)
{
high=mid;
}
else
{
low=mid;
}
if(low==high-1)
{
return high;
break;
}
}
}
void tc(int a[],int n,int x)//对分查找就是告诉我们这个数可以插到哪个位置,把该位置后面的数往后面移就可以了。
{
int k,i;
if(x>a[0])
k=0;
else
k=df(a,n,x);
for(i=n-1;i>k;i--)
{
a[i]=a[i-1];
}
a[k]=x;
}
int main()
{
int i,n,k;
scanf("%d %d",&n,&k);
int a[n];
for(i=0;i<k;i++)
scanf("%d",&a[i]);
xzpx(a,k);
for(i=k;i<n;i++)
{
if(a[i]>a[k-1])
tc(a,k,a[i]);
}
printf("%d",a[k-1]);
return 0;
}
这个运行结果和上面哪个一样哈。
能力有限目前就只会这两种写法,对于N很大的那种就干不了。等以后再进行补充。