列表

详情


DD7. 整数无序数组求第K大数

描述

给定无序整数序列,求其中第K大的数,例如{45,67,33,21},第2大数为45

输入描述

输入第一行为整数序列,数字用空格分隔,如:45 67 33 21 输入第二行一个整数K,K在数组长度范围内,如:2

输出描述

输出第K大的数,本例为第2大数:45

示例1

输入:

45 67 33 21
2

输出:

45

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 256KB, 提交时间: 2019-07-23

#include<stdio.h>
int main()
{
  int a[1000];
  int i=0,k=0,num,j,temp;
 while(1)
    {
        scanf("%d",&a[i]);
        if('\n' == getchar())
            break;
        i++;
    }
  scanf("%d",&k);
  num=i+1;
  for(i=0;i<num;i++)
  {
    for(j=0;j<num-1-i;j++)
    {
      if(a[j]>a[j+1])
      {
        temp=a[j];
        a[j]=a[j+1];
        a[j+1]=temp;
      }
    }
  }
  printf("%d",a[num-k]);
}

C 解法, 执行用时: 2ms, 内存消耗: 292KB, 提交时间: 2021-09-01

#include <stdio.h>
#define ArrayLength 20
int array[ArrayLength];
int main()
{
    int i,j,k,temp,find;
	i = 0;
    while(i < ArrayLength)
    {
	   scanf("%d",&array[i]);
	   if(getchar()=='\n') break;
	   i++;
	}

    for(j =0;j<i;j++)
    {
        for(k = 0;k< i-j;k++)
        {
            if(array[k] < array[k+1])
            {
                temp = array[k+1];
                array[k+1] = array[k];
                array[k] = temp;
            }
            
        }
    }

    scanf("%d",&find);
    printf("%d\n",array[find-1]);
    
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 292KB, 提交时间: 2018-08-18

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE 1024

int cmp(const void *a, const void *b)
{
    return *(int *)b - *(int *)a;
}

int main()
{
    char a[SIZE], b[SIZE], d[SIZE];
	int c[SIZE];
	int tmp = 0, i = 0, len = 0;
    int N = 0, K = 0;
    int left, right;
    
    gets(a);
    gets(d);
    while (a[i] != 0) {
		if (a[i] == ' ') {
			memcpy(b, &a[i-len], len);
            c[N] = atoi(b);
			memset(b, 0, len);
            N++;
			len = 0;
			i++;
			continue;
		}
        len++;
        i++;
	}
	memcpy(b, &a[i-len], len);
    c[N] = atoi(b);    
    K = atoi(d);
    
    qsort(c, N + 1, sizeof(int), cmp);
    printf("%d", c[K - 1]);
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 316KB, 提交时间: 2021-08-10

#include <stdio.h>
#include <stdlib.h>

int main()
{   
    char c;
    int a[1024];
    int k=0;
    int n=0;
    while(c!='\n')
    {
        scanf("%d", &a[n++]);
        if (getchar()=='\n')
            break;
    }
    scanf("%d", &k);
    
    for(int i=0; i<n-1; i++)
    {
        for(int j=0; j<n-1;j++)
        {
           if (a[j]<a[j+1]){
               int tmp = a[j];
               a[j]=a[j+1];
               a[j+1]=tmp;
           }
        }
    }
    printf("%d\n", a[k-1]);
}

C 解法, 执行用时: 2ms, 内存消耗: 336KB, 提交时间: 2019-10-11

#include <stdio.h>
int func(int a[],int k,int n)
{    
    int i,j,t;
    for(i=0;i<n-1;i++)
    {    
        //排好一个就少比较一次
        for(j=0;j<n-1-i;j++)
        {
            //如果前一个比后一个大就交换位置
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    return a[n-k];
}
int main()
{    
    int i=0,b,k;
	int a[20];
	do
	{
		scanf("%d",&a[i]);
		++i;
	}
	while (getchar()!='\n');
	
    scanf("%d",&k);
    b=func(a,k,i);
    printf("%d",b);
    return 0;
}

上一题