思路
简单说一下我的解题思路,因为有序列的判断他可能是从大到小,也可能是从小到大。所以我可以来判断(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了。