有序序列判断

思路

简单说一下我的解题思路,因为有序列的判断他可能是从大到小,也可能是从小到大。所以我可以来判断(a[i]-a[i+1])*(a[i+1]-a[i+2])是否小于0,如果他小于零,说明这个序列的增减方向不一致,所以他是未排序的。引入一个flag来记录他的排序情况,一旦<0,直接break循环,后再判断flag的情况

我的代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n=0;
    cin>>n;//输入序列内的数字个数
    int a[n+1];
    int flag=0;
    for(int i=0;i<n;i++){
        cin>>a[i];//输入序列
    }
    for(int i=0;i<n-2;i++){
        if((a[i]-a[i+1])*(a[i+1]-a[i+2])<0){//判断增减方向是否一致
           flag=1;//不一致,flag变为1
           break;
        }
    }
    if(flag==1){
        cout<<"unsorted"<<endl;
    }
    else{
        cout<<"sorted"<<endl;
    }
}

优化思路

1、两个标志位,一个记录上升,一个记录下降,最后判断,如果同时存在上升和下降说明没有排序。表达的意图是一样的,还是来判断增减是否同时存在,但他的判断方式要比我的快。

#include <stdio.h>
int main()
{
    int a[55],n,flag1=0,flag2=0,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(i>0){
            if(a[i]<a[i-1]){
                flag1=1;
            }else if(a[i]>a[i-1]){
                flag2=1;
            }
        }
    }
    if(flag1&&flag2) printf("unsorted\n");
    else printf("sorted\n");
}

2、官方题解。他直接判断前两项的大小关系,来确定这个序列是递增还是递减。只需要找到一对不符合增减顺序的两项,就可以直接break。

#include<iostream>

using namespace std;

int main()
{
    int n;
    cin>>n;
    int a[n+1];//放置索引越界,将数组定义的大一些
    for(int i=0;i<n;++i)
        cin>>a[i];//依次输入数组a中的元素
    for(int j=2;j<n;++j)
    {
        if(a[1]>a[0])//判断开头是升还是降,进入if表示是升序
        {
            if(a[j]<a[j-1])//如果有不符合的
            {
                cout<<"unsorted";//则不是有序的
                break;
            }
            else if(j==n-1)//一直到最后都是符合的
                cout<<"sorted";//则整个数组都是升序,输出有序
        }
        else//如果开头是降序
        {
          if(a[j]>a[j-1])//有相邻元素不满足降序排列
        {
            cout<<"unsorted";//则不是有序的
            break;
        }
        else if(j==n-1 )//一直到最后,整个数组都是降序的
            cout<<"sorted";//输出有序
        }
    }
    return 0;
}

总结

所以,在对序列的增减进行判断时,有两种方法,首先一种就是找这个序列是否增减顺序两种都存在,if(1)输出unsorted;
第二就是,先通过前两项确定序列是增序列还是减序列,后边再出现增减顺序相反可定就是unsorted了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值