求前m大的数 c语言

求前m大的数 c语言,第1张

这个好像不能用c的库函数qsort,没办法自己写个快速排序函数吧,快速排序函数的时间复杂度是O(nlogn),是不会超时的,我的想法是先对输入的数据按降序进行排序,然后再选择前面的m个不重复的数输出就可以了

#include <stdio.h>

int a[1000001]

int n,m

int partitions(int a[],int low,int high)

{

int pivotkey=a[low]

while(low<high)

{

while(low<high &&a[high]<=pivotkey)--high

a[low]=a[high]

while(low<high &&a[low]>=pivotkey)++low

a[high]=a[low]

}

a[low]=pivotkey

return low

}

void Myqsort(int a[],int low,int high)

{

int pivottag

if(low<high)

{

pivottag=partitions(a,low,high)

Myqsort(a,low,pivottag-1)

Myqsort(a,pivottag+1,high)

}

}

void quicksort(int a[],int n)

{

Myqsort(a,0,n)

}

int main()

{

int i

while(scanf("%d%d",&n,&m)==2)

{

for(i=0i<ni++)scanf("%d",&a[i])

quicksort(a,n)

i=0

while(m &&i!=n)

{

printf("%d ",a[i])

--m

i++

}

printf("\n")

}

return 0

}

其实这个题目估计就是训练你们自己写排序函数,所以建议你自己写几个排序函数测试下

#include "stdio.h"

#define M 3

#define N 10

void main()

{int a[N],i,j,k,l

 int max[M]    /*该数组max[M]用于存放数组a[N]中前M个最大的数的下标*/

 printf("please enter a:")  

 for(i=0i<Ni++)

  scanf("%d",&a[i]) 

 for(j=0j<Mj++)  /*先给max[M]赋值,使其恒大于数组a[N]中的最大下标数N*/

  {max[j]=N+j

   printf("max[%d]=%d ",j,max[j])

  } 

 

 for(j=0j<Mj++)  /*循环求出数组max[j]的值;即数组a[N]中前M大的数的下标*/

 {

 k=-2147483648   /*做一个用于比较大小的中间变量k,取int能取的最小数,使数组a[]中的数恒大等于它*/

    for(i=0i<Ni++) /*依次将k与数组a[N]中的数做比较*/   

    { 

  if(k<a[i])

  {

    for(l=0l<Ml++)   //这里逻辑应该是这样:只有max数组中都没i时,才能对k的值进行更新;

    if(max[l]==i)

     break 

    if(l==M)

          {

   k=a[i] 

            max[j]=i

    }

  }

     }   

  }

   

 printf("\n\n\n")    /*输出数组a

       [N]中前M个最大数*/

 for(j=0j<Mj++)

  {k=max[j]

   printf("%d ",a[k])

  }

  for(i=0i<Ni++)

     printf("%5d",a[i])

}


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/10019966.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存