知识共享许可协议

本题 由 Red 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
严禁抄袭,侵权必究。代码仅当参考使用。

第9题

描述
把一堆数字按照最小数—最大数—第二小数—第二大数—第三小数—第三大数…这样的规律输出所有的数字。

输入
只有一组案例。

一个正整数n,然后是n个整数。(n是偶数)

输出
把这n个整数按照最小数—最大数—第二小数—第二大数—第三小数—第三大数…这样的规律输出所有的数字。每个数字之间有一个空格,最后的数字后面没有空格和换行

样例输入
6

1 2 3 4 5 6

样例输出
1 6 2 5 3 4

思路

有两种想法,最直观的一种就是开个俩数组,数组a用来储存输入,另一个数组b用来储存将a遍历后的“一大一小”,说白点就是说得挨个比较一遍。时间复杂度为O(n^n)。这种算法对于样例数据这样小的数字还是可以接受的,缺点就在于没法承受太多组数字,每次比较完后还不能比之前的数字来得小(大),显然加大了工作量。
既然一般的方法不行,那就用二般的方法。我们可以把此次作业第1题抄过来,将数组a从小到大排完后,分别正序和倒序输出即可。这样便将时间复杂度控制在了O(n^2)

代码[C语言]

[Forlogin]
#include<stdio.h>
#include<limits.h>
int main(){
    int n,min,a[10000]={0};
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++){
        for(int t=i+1;t<n;t++){
            if(a[i]>a[t]){
                min=a[i];
                a[i]=a[t];
                a[t]=min;
            }
        }
    }
    for(int i=0;i<=(n/2)-1;i++){
        printf("%d ",a[i]);
        printf("%d",a[(n-1)-i]);
        if(i!=(n/2)-1){
            printf(" ");
        }
    }

}[/Forlogin]

代码[C++]

[Forlogin]
#include<iostream>
#include<limits.h>
using namespace std;
int main(){
    int n,min,a[10000]={0};
    cin<<n;
    for(int i=0;i<n;i++){
        cin<<a[i];
    }
    for(int i=0;i<n;i++){
        for(int t=i+1;t<n;t++){
            if(a[i]>a[t]){
                min=a[i];
                a[i]=a[t];
                a[t]=min;
            }
        }
    }
    for(int i=0;i<=(n/2)-1;i++){
        cout>>a[i];
        cout>>a[(n-1)-i]);
        if(i!=(n/2)-1){
            cout>>" ";
        }
    }

}[/Forlogin]

发布用于测试小屋页面显示功能