整理关于有序序列的问题

简介: 我们可以设置两个flag,flag1代表升序,flag2代表降序。然后遍历下数组,用后面面的数减去前面的数,如果>0,则flag1++;如果<0,则flag2++;这里呢比较的话n个数比较n-1次就可以了。所以如果最后flag1==n-1或者flag2= =n-1,则表面这个数组是有序的否则不是。

一些关于有序序列的题目--可以练练,积累经验


1.有序序列判断


有序序列判断击进去牛客网练习


34e36c413cd64b639750f42619be1c46.png


这里有序分为正序和逆序,数据呢要么递增,要么递减才符合。那怎么判断呢?


我们可以设置两个flag,flag1代表升序,flag2代表降序。然后遍历下数组,用后面面的数减去前面的数,如果>0,则flag1++;如果<0,则flag2++;这里呢比较的话n个数比较n-1次就可以了。所以如果最后flag1==n-1或者flag2= =n-1,则表面这个数组是有序的否则不是。


#include <stdio.h>
int main()
{
  int n;
  int i;
  scanf("%d", &n);
  int arr[100];
  int count1 = 0;
  int count2 = 0;
  for (i = 0;i < n;i++)
  {
    scanf("%d", &arr[i]);
  }
  for (i = 0;i < n-1;i++)
  {
    if (arr[i + 1] - arr[i] >= 0)
    {
      count1++;
    }
    else
    {
      count2++;
    }
  }
  if (count1 == n - 1 || count2 == n - 1)
  {
    printf("sorted\n");
  }
  else
  {
    printf("unsorted\n");
  }
  return 0;
}


2.有序序列插入一个整数


有序序列插入一个整数


2837c41e828c418ab298dde4953d476e.png


这里要插入一个数,然后要求输出要有序,也就是把这个数也根据大小排进去,我们可以从这个数组的arr【i】(i=n-1)后面开始进行比较,最后面的数字与insert(插入的数字)比较如果小于那么直接把插入的数字放在最后面,如果大于插入的数字那么就要往后面覆盖,留出一个位子,然后再让倒数第二个数与insert比较如果还大于那么就往后走,…直到有一个数比insert小那么就直接让insert插进arr【i+1】里去然后break跳出循环。


这里还有一个比较头疼的事那就是要考虑边界问题,有些问题如果不考虑的话就要出问题,这题就是,如果有这种情况insert比arr数组中的所有数都小,那么arr整个数组都往后覆盖了一格,但insert,并没有插进去,这就很尴尬

5de4c247beac4ce6a9cda76373823e28.png


所以我们需要再讨论一下就讨论如果这个arr【0】>insert那么这种情况就是图上所示的了,需要把insert插入到第一个位子上去。


49b0a61588674dbca0bb04a173796bcb.png


代码如下:


#include <stdio.h>
int main()
{
  int n;
  scanf("%d", &n);
  int i;
  int arr[100];
  for (i = 0;i < n;i++)
  {
    scanf("%d", &arr[i]);
  }
  int insert;
  scanf("%d", &insert);
  for (i=n-1;i>=0;i--)
  {
    if (arr[i] > insert)
    {
      arr[i + 1] = arr[i];
    }
    else
    {
      arr[i + 1] = insert;
      break;
    }
  }
  if (arr[0] > insert)
  {
    arr[0] = insert;
  }
  for (i = 0;i < n+1;i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}


2.有序序列合并


有序序列合并


这里要注意有序的特点,然后遍历两数组即可。要求输入两组有序序列,然后合并再输出一个新的有序序列,这里肯定要先定义三个数组,arr1,arr2,arr3来存放数据,我们可以根据有序的特点来想,用i来遍历arr1,用j来遍历arr2,然后arr1[ i ]与arr2[ j ]来对比,arr3是用来存放两个数组对比出来较小的先放进去,较大的数后放进去,那么该怎么放呢?

d309f16308df4ed1bef17fa1a6fbb36d.png


首先让arr1【i】与arr2【j】比较如果arr1<arr2则将arr1放进arr3中,然后让i++,k++(k是用来遍历arr3的)可以看图 1< 3 那么将1放进arr3中 i++,(k也要++)变成2再与arr2比较还是比3小,把2放进arr3中,i++,k++,5与3相比大于则把arr2中的3放进arr3,然后j++,k++,就这样直到arr1比完,那么arr2中剩余的数可以直接放进arr3中了,因为有序的特点。这个过程是个循环,条件也就是i<n,并且j<m;8f7bcf02c4b941928ab357bd4c4f8c90.png然后这个循环结束了就表面有一个数组遍历完了,但不知道哪一个要分类一下,如果是arr1先遍历完(也就是i==n了),那么需要将arr2中剩下的数放进arr3中,如果是arr2先遍历完(也就是j= =m了),那么需要将arr1中的数放进arr3中,前面的i 和j 已经有了,这里就不用知道循环结束的值直接for(;j<m;j++)或者for(;i<m;i++);把剩下的数放进arr3中时k的值也要一起变喔每次塞进一个数k都要++一下。到这里就把数都从小到大的放进了arr3中了。


int main()
{
  int n, m;
  scanf("%d%d", &n, &m);
  int arr1[1000];
  int arr2[1000];
  int arr3[2000];
  int i;
  for (i = 0;i < n;i++)
  {
    scanf("%d", &arr1[i]);
  }
  for (i = 0;i < m;i++)
  {
    scanf("%d", &arr2[i]);
  }
  //遍历找出比较小的放前面大的放后面//注意这里面的i要重新赋值为0;
  int j = 0;//用j来遍历arr2
  i = 0;//用i在遍历arr1
  int k = 0;//k用来遍历arr3
  while (i < n && j < m)
  {
    if (arr1[i] < arr2[j])
    {
      arr3[k++] = arr1[i++];
    }
    else
    {
      arr3[k++] = arr2[j++];
    }
  }
  if (i == n)
  {
    for (;j < m;j++)
    {
      arr3[k++] = arr2[j];
    }
  }
  else
  {
    for (;i < n;i++)
    {
      arr3[k++] = arr1[i];
    }
  }
  for (i = 0;i < n + m;i++)
  {
    printf("%d ", arr3[i]);
  }
  return 0;
}
相关文章
|
3月前
|
存储 Python
【面试题】排列序列
【面试题】排列序列
32 1
|
5月前
|
存储 算法
数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组
数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组
23 0
数据结构和算法学习记录——删除有序数组中的重复项、合并两个有序数组
|
5月前
|
算法 编译器
【归并排序】两个有序序列的合并
【归并排序】两个有序序列的合并
|
5月前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
|
6月前
|
存储 算法 搜索推荐
【算法训练-排序算法 三】【排序应用】合并区间
【算法训练-排序算法 三】【排序应用】合并区间
81 0
有序序列合并
有序序列合并
61 0
|
6月前
|
存储
力扣187 重复DNA序列
力扣187 重复DNA序列
|
6月前
leetcode-187:重复的DNA序列
leetcode-187:重复的DNA序列
49 0
|
12月前
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
60 0
|
存储
OJ题库:俩个有序序列(数组)合并
OJ题库:俩个有序序列(数组)合并
38 0