| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1570 人关注过本帖
标题:一维数组内部要求有序,如何找出最大的n个值。不能用排序法,下面说明
只看楼主 加入收藏
xiaociwei
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-27
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
一维数组内部要求有序,如何找出最大的n个值。不能用排序法,下面说明
诚求大神的帮助:急需帮忙,不胜感激!
c语言中,一维数组内部要求有序,如何找出其中最大的n个值。
也就是一位数组的下标是有意义的,所以不可以通过排序来实现。
比如说找到最大的3个值是:a[3],a[8],a[22]

[此贴子已经被作者于2016-5-27 23:56编辑过]

搜索更多相关主题的帖子: 不胜感激 最大的 c语言 如何 
2016-05-27 23:39
xiaociwei
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-27
收藏
得分:0 
变来变去还是只会用排序的方法,可是这样一来就得不到数组的下标值了。新手,希望大神们提供一些指导
2016-05-27 23:54
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:5 
#include<stdio.h>
int main()
{
    int i,max,a[6]={2,6,6,3,6,1};//这里对数组初始化比较直观。
    max=a[0];
    for(i=0;i<6;i++)
    {
        if(max<a[i]) max=a[i];
    }
    for(i=0;i<6;i++)
    {
        if(max==a[i])
        printf("a[%d]=%d",i,max);
    }
    return 0;
}
2016-05-28 08:13
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:5 
可以在找到最大的数后,记录下这个数的坐标,再将这个数变成最小的数,下次找最大的数时就不会再找到这个数了,为了数据能还原,需要采取一定的算法,具体如下:
1、找到该数组中最小的数min
2、根据找最大数的个数n循环找最大的数max,找到第一个max,记录下标,将min-max的数据存入该下标,这样现在这个数已经是最小的数
3、根据记录下的下标还原原数组数据。

能编个毛线衣吗?
2016-05-28 09:12
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:10 
不准排数,排下标可以吗?
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

main()
{
    int m=10, n=3;
    int a[m], ai[m], tmp;
    srand((unsigned)time(0));
    for (int i=0; i<m; i++)
    {
        a[i]  = rand()%m + 1;
        ai[i] = i;
    }
    for (int i=0; i<m; i++) 
    {
        for (int j=i+1; j<m; j++)
        {
            if (a[ai[j]] > a[ai[i]])
            {
                tmp   = ai[i];
                ai[i] = ai[j];
                ai[j] = tmp;
            }
        }
    }
    printf("a[]=%d", a[0]);
    for (int i=1; i<m; i++) printf(",%d", a[i]);
    printf("\n在%d个数中取%d个最大的数\n", m, n);
    for (int i=0; i<n; i++) printf("a[%d]=%d\n", ai[i], a[ai[i]]);
}
2016-05-28 14:59
xiaociwei
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-27
收藏
得分:0 
回复 5楼 吹水佬
恩恩,谢谢你,完全解答了我的疑问。就是这儿下标交换的时候晕晕乎乎的,看完明白多了,多谢多谢
2016-05-28 22:13
xiaociwei
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-27
收藏
得分:0 
回复 3楼 linlulu001
谢谢你 之前也没试过求下标,这是求最大值和它对应的下标的好方法。不过我需要求出前k大值,也就是最大的几个数及下标。现在已经明白了,还是非常谢谢你
2016-05-28 22:21
xiaociwei
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2016-5-27
收藏
得分:0 
回复 4楼 wmf2014
谢谢你 很明确的算法思路 又多了一种思考的思路
2016-05-28 22:26
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:0 
回复 5楼 吹水佬
不需要全部排序,第一层循环只需要到n即可。
按我的思路实现代码如下:
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void main()
{
    int m=10, n=3,i,j,k,min;
    int a[10];
    srand((unsigned)time(0));
    for (i=0; i<m; i++)
    {
        a[i]  = rand()%m + 1;
        if(!i)
        {
            min=a[i];
            printf("a[]=");
        }
        if(a[i]<min)min=a[i];  //获取最小的数
        printf("%3d",a[i]);
    }
    printf("\n");
    for(i=0;i<n;i++)
    {
        k=0;
        for(j=0;j<m;j++)if(a[j]>a[k])k=j;;
        printf("a[%d]=%d\n",k,a[k]);
        a[k]=min-a[k];
    }
    //这里可再加一个还原数据的循环,将小于min的数再做一次min-的操作即可还原

}

能编个毛线衣吗?
2016-05-28 23:28
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
听说过最大堆吗?可以google一下。
当然,因为你的题目“最大的3个值”中3太小了,创建一个3个元素的堆小题大做,但其它算法差不多,即创建一个3个元素的下标数组b,将数组中的每个元素一一扔进去,保持数组b一直是3个元素,每次都抛弃掉最小的那个。
2016-05-30 09:01
快速回复:一维数组内部要求有序,如何找出最大的n个值。不能用排序法,下面说明
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020991 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved