数组顺序判断 “朝闻道”知识分享大赛

菜菜菜攻城狮 2023-12-31 15:36:24

这是我参加“朝闻道”知识分享大赛的第五十八篇文章。

 

设计一个算法判断要求2中产生的整数数组是否为或未排序(输出0)、升序(输出1)、降序(输出2)、先升后降(输出3)、或先降后升(输出4)状态;要求只能使用一层循环应该怎么做呢?

使用一层循环也就是说我们只能遍历一次数组,在这一次遍历中我们就需要确定数组的状态。

一层循环判断数组状态的主要思想:初始状态为乱序,赋值为0,当数组的后一项大于前一项时,说明此时是升序,赋值为1,后面循环时若都是升序,无需改变,可当赋值为1时出现后一项小于前一项,说明此时为先升后降,赋值为3。当赋值为3后,若出现后一项大于前一项,此时即为无序状态,赋值为0,结束循环输出结果。若不出现,直接输出结果。当值为0,且数组的后一项小于前一项时,此时为降序,赋值为2,当降序数组出现后一项大于前一项时,即可将其设为先降后升数组状态,赋值为4,当赋值为4的数组出现后一项小于前一项时,即可判断其为无序状态,赋值为0,结束循环输出结果。

代码的实现:数组arr是一个全局变量,所以函数中并未传递参数

生成数组:

//具体的排序函数,保证每个状态出现的概率为1/5,伪概率。
void sortWithArr(){
    int pro =rand()%5+1;
    //cout<<pro<<endl;
    switch (pro){
        case 1:
            //升序
            asc();
            break;
        case 2:
            //降序
            desc();
            break;
        case 3:
            //先升序后降序
            ascAndDesc();
            break;
        case 4:
            //先降序后升序
            DescAndAsc();
            break;
        case 5:
            //无序
            break;

    }

    cout<<"排序之后的数组:";
    for(int i=0;i<n;i++){
        cout<<arr[i]<<"\t";
    }
    cout<<endl;
}

//保证元素不重复而写的函数
bool isInArr(int num,int len){
    for(int i=0;i<len;i++){
        if(num==arr[i]){
            return false;
        }
    }
    return true;
}


//随机生成一个长度为n数组
void question2(){
    arr=(int*)malloc(n*sizeof(int));

    int len=0;
    cout<<"生成的数组:";
    while(len<n){
        //确定数组中数的范围
        int num=rand()%28+1;
        bool flag=isInArr(num,len);

        if(flag){
            arr[len]=num;
            cout<<arr[len]<<"\t";
            len++;
        }
    }
    cout<<endl;
    sortWithArr();
}

 

 

生成数组的状态判断:

//判断生成数组的顺序,一层循环
void question3(){
    int flag1=0;
    for(int i=0;i<n-1;i++){
        int j=i+1;
        if(arr[i]<arr[j]){
            if(flag1==0){
                //升序
                flag1=1;
            }else if(flag1==2){
                flag1=4;    //切换到先降后升

            }else if(flag1==3){
                flag1=0;
                break;
            }
        }else if(arr[i]>arr[j]){
            if(flag1==0){
                //降序
                flag1=2;
            }else if(flag1==1){
                flag1=3;    //切换到先升后降

            }else if(flag1==4){
                flag1=0;
                break;
            }
        }
    }

    if(flag1==0){
        cout<<"无序数组"<<endl;
    }else if(flag1==1){
        cout<<"升序数组"<<endl;
    }else if(flag1==2){
        cout<<"降序数组"<<endl;
    }else if(flag1==3){
        cout<<"先升后降数组"<<endl;
    }else if(flag1==4){
        cout<<"先降后升数组"<<endl;
    }

}

 

...全文
173 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-12-31
精选
  • 打赏
  • 举报
回复
您的问题已经帮您同步至问答, 链接: https://ask.csdn.net/questions/8052492, 请您保持关注, 如果回答有帮助解决此问题, 麻烦您动动小手给相关的回答点赞, Ada会在评论区为您更新结题状态

857

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧