如果中间有相等 3,2,1,1,1,1, 0 ,这不算降序,算无序了!!!
我重新优化了一下,虽改了一点点,但效率提高了很多;
#include "stdio.h"
int order(int dat[ ],int n)
//升序就输出return 1,降序输出-1,乱序输出0
{
int t=dat[1]-dat[0];
int r=t>0?1:(t<0?-1:0);
if (r==0||n<=2) // r==0 时,不管N多少,都不再递归下去,这大大优化了
return(r);
int r1=order(dat+1,n-1);
return (r1==r?r:0);
} // 这递归算法仅六行,够短的了 !!!!
main()
{
int dat[ ]={1,4,2,6};
printf("%d",order(dat,4));
}
我用C++BUILDER6试过了,我的递归是正确的
#include
/* ordered返回四个状态:2:常数列、1:递增、0:无序、-1:递减*/
int ordered(int *a, int n)
{
if(n == 1)return 2;
int t = (a[0]a[1])+2*(a[0]==a[1]),
order = ordered(a+1, n-1);
if(t*order == 0 || t*order == -1)return 0;//无序的情况
if(t > order)t = order; //取min(t, order),使得常数列与有序数列连接,最后属性是有序数列
return t;
}
int main()
{
int i, n, a[256];
scanf("%d", &n);
for(i=0; iscanf("%d", &a[i]);
i = ordered(a, n);
if(i == 2)
i = 1; //将常数列当做递增
printf("%d", i);
}
// Test
3 1 1 1 => 1 //第一个数表示元素个数,把常数列当做递增,所以输出1
3 1 2 3 => 1 //这是递增数列
3 2 2 3 => 1 //题目没有限制是严格递增或递减序列,把2 2 3这样的序列判别成无序是不合理的
3 1 2 1 => 0 //无序
3 3 2 1 => -1 //递减
3 3 2 2 => -1 //递减,类似地,把3 2 2判别成无序是不合理的,它是非严格递减序列
#include
int check(int array[ ] , int n)
{
if (n == 2)//两个元素直接比较并返回结果
return array[1] > array[0]? 1 : -1;
else//多个元素时要分成两个子问题,分别是1~(n-1)和(n-1)~n
{
int ret1;
if ((ret1 = check(array, n - 1)) == 0)//如果1~(n-1)不是有序的那么直接给出结论
return 0;
//如果第一个子问题有序,那么要看和第二个子问题是否顺序与其一致
int ret2 = array[n-1] > array[n - 2]? 1 : -1;
if (ret1 == ret2)//如果一致给出结论
return ret1;
else
return 0;//否则肯定是无序的
}
}
int main ()
{
int a[5] = {34, 35, 36, 37, 38};
int ret = check(a, 5);
printf("%d", ret);
return 0;
}
第归我想不出来.
#include
#define Max 10
void main()
{
int fun(int a[],int n);
int a[Max],i,n,direct;
for(i=0;i
/************************/
n=Max;
direct=fun(a,n);
printf("返回值 %d,",direct);
if(direct==-1)
printf("数组降序\n");
else if(direct==1)
printf("数组升序\n");
else
printf("数组无序\n");
}
int fun(int a[],int n)
{
int i,sum;
sum=0;
for(i=0;i
if(sum==n-1)
return -1;
else
{
sum=0;
for(i=0;i
if(sum==n-1)
return 1;
else
return 0;
}
}
给你个思路
用递归进行排序
再然后在判断大小的if语句里加一个自增变量
如果自增变量==0 | ==9 返回1 或者-1 else 返回0
代码自己写