有序序列中插入一个整数

简介: 有序序列中插入一个整数

3acc6b21d7604520ace22751a3a23d0d.png思路:

将输入的要插入的数m依次和数组中的元素进行比较。

思:

在排好序的数组中,从右往左比较还是从左往右比较?

其实都可以,但是我觉得从右边(也就是最大的数)依次开始比较,程序比较简单些。

从最大的数也就是数组组下标为n-1的元素比较,若是m<a[n-1],则把这个数“移到”它后面(也就是赋值),m再和数组下标为n-2的元素进行比较,若是m<a[n-2],就把这个数“移到”后面,若此时m≥a[n-2],就把m放在数组下标为n-1的位置上。(前面已经把下标为n-1的元素“移到”后面一位,现在n-1这个位置虽然还存放着最初的初值,此时可以方便理解,理解为“垃圾值”)

而之前的为比较的元素,位置就可以不用移动了。

bce654a506f84b2f86167eea434a9ed8.jpg

例:

对数组元素赋初值之后,“1 4 7 9”

8和9进行比较,8<9,9移到下一位

然后8和7比较,8>7,8就填到7后面的一位。

前面不变,进行输出。

代码实现

#include <stdio.h>
int main (void)
{
  int n,a[50]={0};//n为数组元素的个数,数组初始化为0
  int i; //i 作为计数器
  int m=0;//m 为要插入的数据
  //输入数据
  printf("请输入n的值:\n");
  scanf("%d",&n);
  printf("请输入%d个数(从小到大排列):\n",n);
  for (i=0;i<n;i++)
    scanf("%d",&a[i]);
  printf("请输入要插入的数:\n");
  scanf("%d",&m);
  for (i=n-1;m<a[i];i--)//i赋初值,即数组中的最后一个元素
    a[i+1]=a[i];//若不满足循环的条件,不进入循环体,得到变量i的值
  a[i+1]=m;//将m赋值给第i的下一个元素
  for (i=0;i<n+1;i++)//这时数组为n+1个数
    printf("%-2d",a[i]);
  printf("\n");
  return 0;
}

方法二:

如果得知要插入的数,即m排在第几个就好了。

所以可以先讨论m的下标,

分为:

若m小于序列中最小的数,则m的下标为0;(1)

若m大于序列中最大的数,则m的下标为n;(2)

若m大于序列中第i个数,小于第 i+1个数,则m的下标为i+1;(3)

对于第一种情况,将原来数组中所有的数都往后面移动一位。即a[i+1]=a[i],i从n-1开始,i–

对于第二种情况,直接在原数组的第n个元素重新赋值为m就可以了。

对于第三种情况,在k<=i的元素,原来元素不变,第i+1个元素以及之后的元素,都要往后面移动一个坑,留下一个位置给m。即先a[i+1]=a[i],i从n-1开始,i–,然后给a[i+1]重新赋值为m。

代码实现:

#include <stdio.h>
int main (void)
{
  int n,a[50]={0}; //数组初始化为0
  int i,index,k;
  int m=0;//要插入的数 m初始化为0
  //输入数据
  printf("请输入n的值:\n");
  scanf("%d",&n);
  printf("请输入%d个从大到小排列的数:\n",n);
  for (i=0;i<n;i++)
    scanf("%d",&a[i]);
  printf("请输入要插入的m的值:\n");
  scanf("%d",&m);
  if (m>=a[n-1]) //m大于最大的数
    a[n]=m;
  else if (m<=a[0]) //m小于最小的数
  {
    for (i=n-1;i>=0;i--)
      a[i+1]=a[i];
    a[0]=m;
  }
  else   //m在中间
  {
    for (i=0;i<n;i++)
      if (m>=a[i] && m<a[i+1])
      index=i+1;//得到m的下标,把它赋值给index
    for (k=n-1;k>=index;k--) //对于下标为index之后的元素,都往后面“移动一位”
      a[k+1]=a[k];
    a[index]=m;//留下一个空位,即第index位,插入m
  }
  for (i=0;i<=n;i++)   //输出n+1个元素
    printf("%-2d",a[i]);
  return 0;
}


相关文章
|
4月前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
65 1
|
8月前
|
算法
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
arr = [1,2,5,8,9,10,20,30,40] 有一个从小到大排序好的数组,现在输入一个数,要求按照原来的规律插入到数组中
|
1月前
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
给定一个长度为n的数组,请将数组中元素按照奇偶性重新划分,所有奇数靠左边,所有偶数靠右边,然后分别对奇数、偶数部分进行排序
15 1
|
4月前
|
算法 测试技术 C#
C++二分查找或并集查找:交换得到字典序最小的数组
C++二分查找或并集查找:交换得到字典序最小的数组
|
4月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
43 0
|
10月前
有序序列合并
有序序列合并
45 0
|
6月前
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
36 0
|
10月前
|
C语言
C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
描述 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 输入描述: 输入包含三行, 第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。 第二行包含n个整数,用空格分隔。 第三行包含m个整数,用空格分隔。
180 0
C语言:输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
序列中删除指定的数字(普通法、双指针法)
序列中删除指定的数字(普通法、双指针法)
|
算法
算法练习——(8)用下标排序
问题:给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。