前言
我新学了一个判断数组是否有序的细节和方法,和大家分享一下。
一、有序序列判断
题目来源:
描述
输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。
数据范围: 3 \le n \le 50 \3≤n≤50 序列中的值都满足 1 \le val \le 100 \1≤val≤100
输入描述:
第一行输入一个整数N(3≤N≤50)。
第二行输入N个整数,用空格分隔N个整数。
输出描述:
输出为一行,如果序列有序输出sorted,否则输出unsorted。
二、分析问题
大致分析:
很显然第一行输入一个整数,告诉我们接下来有多少个数,那我们就可以定义数组的长度了,运用数组的排序交换就可以得到是否有顺序‘
问题核心:
三、代码如下
1、错误示范: 思路都是错误的,只是说明一下我刚开始的错误思路。
#include<stdio.h> int main(){ int n,a,m=0,w=0; scanf("%d\n",&n); int arr[50]; //根据题目设置50长度,有多无少 for(int i=0;i<n;i++){ scanf("%d ",&arr[i]); //输入全部,我以为有个循环就,a[0]输入一个然后自己跳到a[1]我再输 入一个数。结果不是。 if(arr[i]<=arr[i-1]){ m=1; //下面比对,如果是前面小于后面(升序),就m=1 } else if(arr[i]>arr[i-1]){ w=1; //这个是降序,w=1 } } if(m==1&&w==1){ //两个同时成立就什么有升有降就不行了是unsorted. printf("unsorted"); } else{ printf("sorted"); } return 0; }
2、正确思路
#include<stdio.h> int main(){ int n,a,m=0,w=0; scanf("%d\n",&n); int arr[50]; for(int i=0;i<n;i++){ scanf("%d ",&arr[i]); //关键点:与之前不同,它是先输入一个数就往下走一次 if(i>0){ if(arr[i]<arr[i-1]){ //第一次输入的时候,i=0,i-1还没出生,所以i>0才开始判断 m=1; } else if(arr[i]>arr[i-1]){ w=1; } } } if(m==1&&w==1){ //下面同理 printf("unsorted"); } else{ printf("sorted"); } return 0; }
总结
以上就是今天要讲的内容,本文仅仅简单介绍了判断数组是否有序的方法,最主要在于能不能理解它是输入一次往下走一次(这是我的理解,我也是个初学者,要是不对请一定要给指正,笔者不胜感激),然后分别用正序和倒序一起判断整体。