目录
要求:输入一个序列,判断是否是有序,有序指:从小到大有序或者从大到小有序即可。对于相同的值,认为是有序的。
目的:如果有序,输出sorted;否则,输出unsorted
对于有序序列的要求:
序列长:0~50 序列中数值:3~100
思路1
一般情况下,我们希望是邻近元素两两比较,然后分别进入两个循环,这两个循环分别为判断降序和升序的循环,一旦进入循环,如果不是所有元素比较完,才出循环,则认为一定不是有序序列。
思路2
但是对于思路一过于繁琐,空间复杂度会很高,所以我们这里提出另一种思路:
第一步:我们可以设置两个标杆flag1和flag2,初始值为 0,然后在两相邻两元素比较之后,如果前面元素大于后面,则flag1赋值为 1,反之flag2 赋值为1。然后一直重复比较相邻两元素,直到所有元素比较完事。
第二步:最后,当所有元素比较完事之后,判断flag1与flag2的和是否是 2,如果是,就说明这一序列中的元素,不是升序或者降序,而是乱序的;如果不是,就说明,每次比较一直都是改变其中一个的值,所以是有序的。
代码实现
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
int flag1 = 0;
int flag2 = 0;
int arr[50] = { 0 };
int n = 0;
scanf("%d",&n);
for (i = 0; i < n; i++)
{
scanf("%d",&arr[i]);
if (i > 0)
{
if (arr[i] > arr[i - 1])
flag1 = 1;
else
flag2 = 1;
}
}
if (flag1 + flag2 == 2)
printf("unsorted");
else
printf("sorted");
return 0;
}
然后,这里还需要注意的是,标杆外层的 if 语句,其实有没有都是一样的。因为这个判断是为了防止出现序列中只有一个数的情况,但是其实如果只是一个数,那么我们认为其应该是有序的。
本文到此就结束啦,如有错误,还请指正呀!