首页 > 试题广场 >

N个数(其中数可重复),求出其中第m大的数。(可写出多种想法

[问答题]
N个数(其中数可重复),求出其中第m大的数。(可写出多种想法以及其适用场景,但至少写一种你最中意的那个想法)

答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
#include<stdio.h>
(737)#define STLEN 20
void main(void)
{
	int a[STLEN]={};
	int N,m,i,j;
	int max,temp;
	printf("Enter N and m value:");
	scanf("%d %d",&N,&m);
	for(i=0;i<N;i++)
	{
		scanf("%d",&a[i]);
	}
	for(i=0;i<m;i++)  //排到第m个数为止
	{
		max=i;
		for(j=i+1;j<N;j++)
		{
			if(a[max]<a[j])
			{
				max=j; //选择排序
			}
		}
		temp=a[max];
		a[max]=a[i];
		a[i]=temp;
	}
	printf("第%d个大的数是%d\n",m,a[m-1]);
}


编辑于 2020-04-27 18:30:42 回复(1)
#include <stdio.h>
int main()
{
	int arr[] = {51,21,58,63,14,45,23,54,77,84,64,31,21,85,95};
	int n = sizeof(arr)/sizeof(arr[0]);
	int i, j, temp;
	int m;
	for(i=0; i<n; i++)
	{
		for(j=0; j<n-i-1; j++)
		{
			if(arr[j] < arr[j+1])
			{
				temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;
			}
		}
	}
	for(i=0; i<n; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
	printf("请输入m的值:");
	scanf("%d",&m);
	printf("第%d大的数为 %d\n",m,arr[m-1]);
	return 0;
}

发表于 2019-11-10 11:01:14 回复(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	int a[100],n,m,i,j,k,t,x,y,z;
	printf("输入n和m:\n");
	scanf("%d%d",&n,&m);
	printf("输入这n个数:\n");
	for(i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	for(j=0;j<n;j++){
		x=0;
		y=0;
		z=0;
		for(k=0;k<n;k++){
			if(a[k]<a[j])
				x++;
			else if(a[k]>a[j])
				y++;
			else
				z++;
		}
		if(x<m&&(x+z)>=m){
			printf("第m大的数是:\n%d",a[j]);
			break;
		}
		else if(x>=m){
			for(t=j+1;t<n;t++){
				if(a[t]<a[j]){
					j=t-1;
					break;
				}
			}
		}
		else{
			for(t=j+1;t<n;t++){
				if(a[t]>a[j]){
					j=t-1;
					break;
				}
			}
		}
	}
}
发表于 2019-09-05 01:09:30 回复(0)
int fun(vector<int>&N, int m){
    set<int, greater<int>>nums; 
    for (int i = 0; i < N.size(); i++){
        nums.insert(N[i]);
    }
    set<int>::iterator iter = nums.begin();
    for (int i = 0; i < m-1; i++){
        iter++;
    }
    return *iter;
}
发表于 2018-08-22 13:42:50 回复(0)
#include <stdio.h>
#include <string.h>
#define N 10 
int main()
{
    int arr[N];
    int i, j, m;
    int bigcount = 0;
    int temp = 0;
    printf("输入%d位的数组:\n", N);
//打印数组
    for (i = 0;i < N;i++)
    {
    scanf_s("%d",&arr[i]);
    }
    printf("需要找出第几大的数:\n");
    scanf_s("%d", &m);
//找出最大的数
    for (i = 0;i < N;i++)
    {
        if (bigcount < arr[i])
        {
            bigcount = arr[i];
        }
    }
//找出第m大的数
    for (j = 1;j < m;j++)
    {
        for (i = 0;i < N;i++)
        {
            if (temp <arr[i] && arr[i] < bigcount)
            {
                temp = arr[i];
            }
        }
        bigcount = temp;
        temp = 0;
    }
    printf("第%d大的数是:%d", m,bigcount);
    return 0;
}
发表于 2023-03-11 17:40:36 回复(0)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
   int a[10];
   int b[10];
   int i,j,len,count=0,flag;
   int N,m;
   scanf("%d,%d",&N,&m);
   printf("请输入%d个数",N);
   for(int k=0;k<N;k++)
   {
   scanf("%d",&a[k]);
   }
   for(i=0;i<N;i++)
   {
       flag=1;
         for(j=i-1;j>=0;j--)
             if(a[i]==a[j])
             {
                 flag=0;
                 break;
             }
       if(flag==1)
          b[count++]=a[i];
   }
      for(int c=0;c<count;c++)
   {
     for(int g=c+1;g<count;g++)
     {
       if(b[c]<b[g])
     {
     int tem;
     tem = b[c];
     b[c] = b[g];
     b[g] = tem;
     }
     }
     }
   printf("第%d大的数为%d\n",m,b[m-1]);
   return 0;
}
发表于 2022-07-25 20:32:59 回复(0)
void max_values_compare_and_repleace(int *r, int m, int v)
{
    int i;

    if (r[0] >= v) {
        return;
    }

    r[0] = v;
    for (i = 0; i < m - 1; i++) {
        if (r[i] > r[i + 1]) {
            //swap
            r[i] = r[i + 1];
            r[i + 1] = v;
        }
    }
}

int slove(int *arr, int size, int m)
{
    int *r = (int *)malloc(m * sizeof(int));
    int i;
    int max_m;

    memset(r, -1, m * sizeof(int));

    for (i = 0; i < size; i++) {
        max_values_compare_and_repleace(r, m, arr[i]);
    }

    max_m = r[0];
    free(r);

    return max_m;
}

发表于 2021-10-29 21:06:56 回复(0)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
int maxx(int n,int m,int *x,int p);
int maxx(int n,int m,int *x,int p)
{
int y[1];
int t;
   for(int i=0;i<n-1;i++)//先全部比较一次找到最大的 再递归m-1次比较进行排序
 {
   printf("要比较的数字:%d %d\n",x[i],x[i+1]);//永远确保x[n-1]是最大的
   if(x[i]>x[i+1])
   {
    printf("成功进入交换环节\n");
    y[0]=x[i];
   x[i]=x[i+1];
   x[i+1]=y[0];
  printf("换完之后:大的%d 小的%d\n",x[i+1],x[i]);
     for(t=0;t<n;t++)
   {
    printf("现在的数组是%d\n",x[t]);
    }

   }
  }
printf("现在的数组最大的是%d\n",x[n-1]);

if(m==0)
{
return x[n-p];
}
maxx(n,m-1,x,p);

}
int main()
{
  srand(time(NULL));
  int n,m,p;
   printf("随机输入N个数 得到第M大的值\n");
   scanf("%d %d",&n,&m);
p=m;
   int x[n];
  for(int i=0;i<n;i++)
{
   x[i]= rand() % 100;
    usleep(1);
   printf("随机数:%d\n",x[i]);
}

  printf("第%d大的数为%d\n",m,maxx(n,m,x,p));
   }

编辑于 2021-10-21 19:26:01 回复(0)
先排序在考虑重复问题
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int N, m, i, j, count = 0;
    printf("输入N和m的值:");
    scanf("%d %d", &N, &m);
    if (N < m) {
        printf("输入的数据不符合要求!请重新输入!");
        return 0;
    }
    else {
        int array[1000] = { 0 };        
        printf("输入N个整数:");
        for (i = 0; i < N; i++) {
            scanf("%d", &array[i]);
        }
        for (i = 0; i < N; i++) {   //从大到小排序
            for (j = 0; j < N - i - 1; j++) {
                if (array[j] < array[j + 1]) {
                    array[j] = array[j] + array[j + 1];
                    array[j + 1] = array[j] - array[j + 1];
                    array[j] = array[j] - array[j + 1];
                }
            }
        }

        for (i = 0; i < N; i++) {    //消除相同值带来的影响
            if (array[i] == array[i + 1]) {
                if (i < m) {
                    count++;
                }
            }
        }
        m += count;
        if (N < m) {
            printf("输入的数据不符合要求!");
        }
        printf("输出第m大的值:");
        printf("%d", array[m - 1]);
        return array[m];
    }
}

发表于 2021-09-03 23:18:56 回复(0)
int N,M;
int am[N];
int i=0,j=0,k=1,t=1;
if(M<=N/2) ;
else M=N-M,t=0;
while(k<M)
{    for(i=M-1;i>=j;){
        if(am[k]>am[i]&&t)  am[i+1]=am[i];
        else if(am[k]<=am[i]&&t==0) am[i+1]=am[i];
         else break;
         i--;
    }
    am[i+1]=am[k];
    k++;
}
return am[m-1];
发表于 2020-12-07 16:18:58 回复(0)
#include<stdio.h>
int bp(int arr[],int len,int m)
{
    int i;
    int j;
    int pflag;
    for(i=0;i<len-1;i++)
    {
        pflag=0;
        for(j=0;j<len-i-1;j++)
        {
            if(arr[j]<arr[j+1])
            {
                arr[j]=arr[j]^arr[j+1];
                arr[j]=arr[j]^arr[j+1];
                arr[j]=arr[j]^arr[j+1];
                pflag=j+1;
            }
        }
        if(pflag==0)
        {
            break;
        }
        i=len-pflag-1;
    }
    return arr[m];
}
int main()
{
    int arr[]={4,2,6,7,5,88,66,22,33};
    int n = bp(arr,9,9);
    printf("%d\n",n);
    return 0;
}
发表于 2020-08-20 15:36:21 回复(0)
//分治思想找第k个最大
class Solution {
public:
    int my_sort(vector<int>& nums,int l,int k,int r)//数组有效区间的起始下标,k,结束下标
    {
       int pivot=rand()%(r-l+1);
       swap(nums[pivot+l],nums[r]);   //pivot元素交换到有效区间的最后
       int temp = l;
       for(int i=l;i<r;i++) {
           if(nums[i]>=nums[r]) {  //如果大于等于则交换到前面去
               swap(nums[i],nums[temp]);
               temp++;
           }
       }
       swap(nums[temp],nums[r]);  //此时temp所指向的位置,左边比nums[temp]大,右边比它小
        if (temp-l==k-1) return nums[temp];  //temp-l等于temp左边(不包括temp)的个数
        else if(temp-l<k-1) return my_sort(nums,temp+1,k-(temp-l+1),r); //第k大出现在temp右边
        else return my_sort(nums,l,k,temp-1); //否则出现在左边
    }
   
    
    int findKthLargest(vector<int>& nums, int k)  
    {
        return my_sort(nums,0,k,nums.size()-1);
    }
};

发表于 2020-08-12 17:46:52 回复(0)
#include "pch.h"
#include <iostream>
#include <stdio.h>

#define STLEN 20
using namespace std;


int  main(void)
{
	int a[STLEN] = {};
	int N,m, i, j;
	int max, temp;
	printf("Enter N and m value:");
	scanf_s("%d %d",&N,&m);
	for (i = 0;i < N;i++)
	{
		scanf_s("%d",&a[i]);

	}
	for (i = 0;i < m;i++)
	{
		max = i;
		for (j = i + 1;j < N;j++)
		{
			if (a[max] < a[j])
			{
				max = j;//选择排序
			}
		}
		temp = a[max];
		a[max] = a[i];
		a[i] = temp;
	}
	printf("第%d个大的数是%d\n", m, a[m - 1]);
}

发表于 2020-08-07 21:53:20 回复(0)
/*
//quick sort
int compare(const void* a, const void* b) {
    return *(int*)a - *(int*)b
}
 
int kthmax(int* arr, int n, int m) {
    qsort(arr, n, sizeof(int), compare);
    return arr[n - m];
}
*/

//快速选择
void swap(int* arr, int a, int b) {
    int tmp = arr[a];
    arr[a] = arr[b];
    arr[b] = tmp;
}
 
int Partition(int* arr, int start, int end) {
    int root = start;
    int left = start + 1;
    int right = end;
    while (left <= right) {
        while (left <= right && arr[left] >= arr[root]) {
            left++;          //找到比root小的数
        }
        while (left <= right && arr[right] <= arr[root]) {
            right--;        //找到比root大的数
        }
        if (left < right) {
            swap(arr, left++, right--);
        }
        swap(arr, root, right);
        return right;
    }
}
 
int kth_max(int* arr, int n, int m) {
    if (n == 0) {
        return NULL;
    }
    int start = 0;
    int end = n - 1;
    while (1) {
        int position = Partition(arr, start, end);
        if (position == m - 1) {
            return arr[m - 1];
        }
        else if (position > m - 1) {
            right = position - 1;
        }
        else {
            left = position + 1;
        }
    }
}

发表于 2020-07-27 11:40:02 回复(0)
#include<stdio.h>

void __quickSort(int arr[],int left,int right){
int t = left;
int i=left;
int e = left+1;
int temp;
if(left >= right)
return;
for(e;e<=right;e++){
if(arr[e]>arr[t]){
temp = arr[e];
arr[e] = arr[i+1];
arr[i+1] =temp;
i++;
}
}
temp = arr[t];
arr[t] = arr[i];
arr[i] =temp;

__quickSort(arr,left,i-1);
__quickSort(arr,i+1,right);

};
void quickSort(int arr[],int size){
__quickSort(arr,0,size-1);

}

int solution(int arr[],int size,int m ){
int brr[50]={0}; //hash table
int index=0;
for(int i=0;i<size;i++){
if(brr[arr[i]] == 0){
brr[arr[i]] = arr[i];
index++;
if(index == m){
return (brr[arr[i]]);}
}
}

};

int main(){
int arr[8]={3,9,2,3,1,6,34,49};
int sol;
quickSort(arr,8);
sol=solution(arr,8,1);
printf("%dth greatest number is %d\n",1,sol);
for(int i=0;i<6;i++){
printf(" %d",arr[i]);
}


}
发表于 2019-08-18 08:17:08 回复(0)
//可以用c++的STL库函数实现N个数的稳定排序,再找出第m个数
#include<iostram>
#include<functional>
#include<algorithm>
#include<string>

using namespace std;
int main(){
string s;
int m;
getline(cin,s);//获得这一串数
cin>>m;
sort(s.begin(),s.end(),greater<char>());
cout<<s[m]<<endl;
}
发表于 2019-08-03 11:54:27 回复(0)
#include<iostream>
#include<vector>
#include<ctime>
#include<algorithm>
using namespace std;

int main()
{     int N;     cin >> N;     srand(time(0));     vector<int> res;     for (int i = 0; i < N; ++i)     {         res.push_back(rand() % 10 + 1);     }          sort(res.begin(), res.end());         int m;     cin >> m;     vector<int>::iterator iter=res.begin();     while (iter != res.end())     {         if (*iter ==*(iter + 1))             res.erase(iter+1);         iter++;     }        cout << res[res.size()-m] << endl;     system("pause");     return 0;


}
先对数组进行排序,然后删除重复的数据,最后根据m的大小直接就可以输出m大的数据。如有不正确或者更好的办法,请大家指教~

发表于 2019-06-04 15:35:43 回复(0)
#include <iostream>
using namespace std;

int main()
{
    int i,j;
    int a[N]={0};
    printf("请输入N个数:\n");
    for(i=0;i<N;i++)
    {
            scanf("%d",&a[i]);
    }
     for(i=0;i<N;i++)
    {
            for(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("第M大的数为:%d\n",a[m-1]);
    return 0;
}
发表于 2018-08-16 20:18:21 回复(8)