首页 > 试题广场 >

请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正

[单选题]
下列给定程序中,函数fun的功能是:把形参a所指数组中的最小值放在元素a[0]中,接着把a所指数组中的最大值放在a[1]元素中;再把a所指数组元素中的次小值放在a[2]中,把a索取数组元素中的次大值放在a[3],以此类推。
例如:若a所指数组中的数据最初排列为:9,1,4,2,3,6,5,8,7;按规则移动后,数据排列为:1,9,2,8,3,7,4,6,5。形参n中存放a所指数组中数据的个数。
规定fun函数中的max存放的当前所找的最大值,px存放当前所找最大值得下标。 请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
试题程序。
#include <stdio.h>
#define N 9
void fun(int a[], int n) {
    int i, j, max, min, px, pn, t;
    for (i = 0; i < n - 1; i += 2) {

        max = min = __;
        px = pn = i;
        for (j = i + 1; j < n; j++) {

            if (max < __) {
                max = a[j];
                px = j;
            }

            if (min > __) {
                min = a[j];
                pn = j;
            }
        }
        if (pn != i) {
            t = a[i];
            a[i] = min;
            a[pn] = t;
            if (px == i)
                px = pn;
        }
        if (px != i + 1) {
            t = a[i + 1];
            a[i + 1] = max;
            a[px] = t;
        }
    }
}
int main() {
    int b[N] = {9, 1, 4, 2, 3, 6, 5, 8, 7};
    printf("\nThe original data:\n");
    for (int i = 0; i < N; i++)
        printf("% 4d", b[i]);
    printf("\n");
    fun(b, N);
    printf("\nThe data after mocinng \n");
    for (int i = 0; i < N; i++)
        printf("% 4d", b[i]);
    printf("\n");
    return 0;
}


  • 0 a[i] a[i]
  • a[i] a[j] a[j]
  • 0 a[j] a[j]
  • a[i] a[i] a[i]
max与min不是赋初值,而是每一次循环均会重新赋值,且每一次循环i值加2,故应该每次赋给未排序的i序列的最左边的值。
编辑于 2016-01-10 10:08:16 回复(0)

要求:1 9 2 8 3 7 4 6 5(min、max、min、max......)

(1)i=0

max=min=9 px=pn=0

i

0

1

2

3

4

5

6

7

8

a[i]

9

1

4

2

3

6

5

8

7

 

第一步:找最大值、最小值j++

max=9,min=1,px=0,pn=1

 

第二步:比较px与i+1、pn与i

pn=1不等于i:

t=9;a[i]=min=1;a[pn]=t;px=pn;

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

4

2

3

6

5

8

7

px=1等于i+1:不交换

 前两个元素就排好了,处理剩下的元素

 

(2)i=2

max=min=4 px=pn=2

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

4

2

3

6

5

8

1

 

第一步:找最大值、最小值j++

max=8,min=2,px=7,pn=3

 

第二步:比较px与i+1、pn与i

pn=3不等于i:

t=4;a[i]=min=2;a[pn]=t;

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

4

3

6

5

8

7

 

px=7不等于i+1:

t=4;a[i+1]=max=8;a[px]=t;

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

6

5

4

7

  前四个元素就排好了,处理剩下的元素

(3)i=4

max=min=3 px=pn=4

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

6

5

4

7

 

第一步:找最大值、最小值j++

max=7,min=3,px=8,pn=4

 

第二步:比较px与i+1、pn与i

pn=4等于i:不交换

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

6

5

4

7

 

px=8不等于i+1:

t=6;a[i+1]=max=7;a[px]=t;

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

7

5

4

6

  前六个元素就排好了,处理剩下的元素
(4)i=6

max=min=5 px=pn=6

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

7

5

4

6

第一步:找最大值、最小值j++

max=6,min=4,px=8,pn=7

 

第二步:比较px与i+1、pn与i

pn=7不等于i:

t=5;a[i]=min=4;a[pn]=t;

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

7

4

5

6

 

px=8不等于i+1:

t=5;a[i+1]=max=6;a[px]=t;

i

0

1

2

3

4

5

6

7

8

a[i]

1

9

2

8

3

7

4

6

5

  前8个元素就排好了,剩下的一个元素一定满足,退出循环

(5)i=8,8不满足i<n-1,退出循环

运行结束

输出:1 9 2 8 3 7 4 6 5
代码:
#include<iostream>
using namespace std;
#define N 9
void fun(int a[],int n);//功能函数
int main()
{
    int b[N]={9,1,4,2,3,6,5,8,7};
    cout<<"\nThe original data:\n";
    for(int i=0;i<N;i++)
    cout<<b[i]<<" ";
    cout<<endl;
    fun(b,N);
    cout<<"\nThe data after mocinng: \n";
    for(int i=0;i<N;i++)
    cout<<b[i]<<" ";
    cout<<endl;
    return 0;
}
void fun(int a[],int n)
{
    int i,j,max,min,px,pn,t;
    for(i=0;i<n-1;i+=2)
    {
        max=min=a[i];
        px=pn=i;
//找最大值和最小值
        for(j=i+1;j<n;j++)
        {
            if(max<a[j])//找到最大值并标记
            {
                max=a[j];
                px=j;
            }
            if(min>a[j])//找到最小值并标记
            {
                min=a[j];
                pn=j;
            }
        }

//交换
            if(pn!=i)
            {
                t=a[i];
                a[i]=min;
                a[pn]=t;
                if(px==i)//避免9、1这种情况交换后又进入if(px!=i+1)循环
                {
                    px=pn;//改变px,px应指向最大值
                }
            }
            if(px!=i+1)
            {
                t=a[i+1];
                a[i+1]=max;
                a[px]=t;
            }
    }
}




发表于 2022-07-14 16:58:03 回复(1)
第一空是把a中的一个元素赋给max和min  此时i=0  即填a[i]
第二空是判断max和a[j]的大小关系
第三空是判断min和a[j]的大小关系
发表于 2015-02-15 17:05:10 回复(0)
一开始最大最小值都默认是第一个元素,而不是0,这里有点迷惑
发表于 2022-02-28 00:50:23 回复(2)
第一步:找出最小值和最大值,将他们保存在a[0]和a[1]中
第二步:在剩余的数中找出最小值和最大值,保存在a[2]和a[3]中
...
发表于 2015-06-09 15:58:46 回复(0)
选择排序思想
发表于 2016-07-15 09:02:18 回复(0)
答案是B,分析一下就很简单
发表于 2015-02-05 20:15:45 回复(0)
这道题我觉得b 和c 都对吧, 赋值0。咋就不行,这个数组给固定死了,并没有负数呐
发表于 2022-08-03 09:44:00 回复(0)
类比一下选择排序!
发表于 2020-05-16 16:39:41 回复(0)
我就想问下31行32行有什么用。。。
发表于 2020-03-07 22:43:55 回复(0)
排除来看,max和min的值是得不断变化的,就不能选附初值的所以排除两个答案,还有两个里面看后面代码中,根据排序的思想看代码,是和a[j]比较,所以答案显而易见。
发表于 2018-06-04 14:43:25 回复(0)
没循环一次都要重新赋值而不是赋初值
发表于 2017-03-01 14:42:35 回复(0)
啊,,,忘记每次的第一个位置都在变
发表于 2016-05-17 08:22:14 回复(0)
为啥遇到好几个这样的题目!有的选A,有的选B,求解释
发表于 2015-09-10 08:57:11 回复(1)