1,035
社区成员
这是我参加“朝闻道”知识分享大赛的第五十八篇文章。
设计一个算法判断要求2中产生的整数数组是否为或未排序(输出0)、升序(输出1)、降序(输出2)、先升后降(输出3)、或先降后升(输出4)状态;要求只能使用一层循环应该怎么做呢?
使用一层循环也就是说我们只能遍历一次数组,在这一次遍历中我们就需要确定数组的状态。
一层循环判断数组状态的主要思想:初始状态为乱序,赋值为0,当数组的后一项大于前一项时,说明此时是升序,赋值为1,后面循环时若都是升序,无需改变,可当赋值为1时出现后一项小于前一项,说明此时为先升后降,赋值为3。当赋值为3后,若出现后一项大于前一项,此时即为无序状态,赋值为0,结束循环输出结果。若不出现,直接输出结果。当值为0,且数组的后一项小于前一项时,此时为降序,赋值为2,当降序数组出现后一项大于前一项时,即可将其设为先降后升数组状态,赋值为4,当赋值为4的数组出现后一项小于前一项时,即可判断其为无序状态,赋值为0,结束循环输出结果。
代码的实现:数组arr是一个全局变量,所以函数中并未传递参数
生成数组:
//具体的排序函数,保证每个状态出现的概率为1/5,伪概率。
void sortWithArr(){
int pro =rand()%5+1;
//cout<<pro<<endl;
switch (pro){
case 1:
//升序
asc();
break;
case 2:
//降序
desc();
break;
case 3:
//先升序后降序
ascAndDesc();
break;
case 4:
//先降序后升序
DescAndAsc();
break;
case 5:
//无序
break;
}
cout<<"排序之后的数组:";
for(int i=0;i<n;i++){
cout<<arr[i]<<"\t";
}
cout<<endl;
}
//保证元素不重复而写的函数
bool isInArr(int num,int len){
for(int i=0;i<len;i++){
if(num==arr[i]){
return false;
}
}
return true;
}
//随机生成一个长度为n数组
void question2(){
arr=(int*)malloc(n*sizeof(int));
int len=0;
cout<<"生成的数组:";
while(len<n){
//确定数组中数的范围
int num=rand()%28+1;
bool flag=isInArr(num,len);
if(flag){
arr[len]=num;
cout<<arr[len]<<"\t";
len++;
}
}
cout<<endl;
sortWithArr();
}
生成数组的状态判断:
//判断生成数组的顺序,一层循环
void question3(){
int flag1=0;
for(int i=0;i<n-1;i++){
int j=i+1;
if(arr[i]<arr[j]){
if(flag1==0){
//升序
flag1=1;
}else if(flag1==2){
flag1=4; //切换到先降后升
}else if(flag1==3){
flag1=0;
break;
}
}else if(arr[i]>arr[j]){
if(flag1==0){
//降序
flag1=2;
}else if(flag1==1){
flag1=3; //切换到先升后降
}else if(flag1==4){
flag1=0;
break;
}
}
}
if(flag1==0){
cout<<"无序数组"<<endl;
}else if(flag1==1){
cout<<"升序数组"<<endl;
}else if(flag1==2){
cout<<"降序数组"<<endl;
}else if(flag1==3){
cout<<"先升后降数组"<<endl;
}else if(flag1==4){
cout<<"先降后升数组"<<endl;
}
}