数组中有序序列判断,有序序列合并,序列中删除指定数字(c实现)

目录

第一题:有序序列判断

 思路

伪代码

代码

第二题:有序序列合并

 思路

伪代码

代码

第三题:序列中删除指定数字

思路

代码


第一题:有序序列判断

所谓的有序就是指升序或者降序

升序:1 2 3 4 5 6 7 8 9.......

降序:9 8 7 6 5 4 3 2 1......

下面来看题

 

 思路

当该序列既有升序又有降序的时候那么这个序列就是无序的

伪代码

●初始化两个标记,一个标记代表降序,一个代表升序

●判断数组相邻两个元素的大小关系,并改变标记的值

●当两个标记都改变时,代表无序unsorted,否则代表有序sorted

代码

#include<stdio.h>
int main(){
    int arr[200],n,i,flag1=0,flag2=0;//flag*为两个标记
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    for(int i=0;i<n-1;i++){
        if(arr[i]>arr[i+1]){
            flag1=1;
            
        }else if(arr[i]<arr[i+1]){
            flag2=1;
        }
    }
    if(flag1&&flag2){
        printf("unsorted\n");
        
    }else{
        printf("sorted\n");
    }
    return 0;
}

时间复杂度为O(n)遍历了整个数组

额外空间复杂度为O(1)只用了几个变量

第二题:有序序列合并

题目:

 

 思路

我的第一思路就是通过归并排序来解决,但是归并排序只能解决,两个数组之间只多一个元素的情况,所以这个思路不可以。因为是有序的且为升序,所以我们可以比较两个数组里面的元素,将小的的印出来,直到其中一个数组越界,那么剩下的元素就是递增的(这个思想和归并排序差不多)接着打印出来

伪代码

●通过循环在其中一个数组越界之前打印出两个数组中较小的值

●通过判断打印出剩下的元素的值,这些值都是递增的且有序

代码

#include <stdio.h>
int main()
{
    int n = 0;
    int m = 0;
    int arr1[100] = {0};
    int arr2[100] = {0};
    //输入
    scanf("%d %d", &n, &m);
    int i = 0;
    for(i=0; i<n; i++)
    {
        scanf("%d", &arr1[i]);
    }
    for(i=0; i<m; i++)
    {
        scanf("%d", &arr2[i]);
    }
    //处理
    int j = 0;
    i = 0;
    while(i<n && j<m)//在其中一个数组越界前打印出较小的元素
    {
        if(arr1[i] < arr2[j])
        {
            printf("%d ", arr1[i]);
            i++;
        }
        else
        {
            printf("%d ", arr2[j]);    
            j++;
        }
    }
    if(i == n)//判断是那个数组越界
    {
        for(; j<m; j++)
        {
            printf("%d ", arr2[j]);
        }
    }
    else
    {
        for(; i<n; i++)
        {
            printf("%d ", arr1[i]);
        }
    }
    return 0;
}

第三题:序列中删除指定数字

 

思路

这个题目很简单,我们只需要遍历整个数组,将不等于要删除的元素打印出来即可

没有伪代码

代码

#include<stdio.h>
int main(){
    int arr[50]={0};
    int n=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    int x;
    scanf("%d",&x);
    for(int i=0;i<n;i++){
        if(arr[i]!=x){
            printf("%d ",arr[i]);
        }
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值