本文主要阐明已知顺序数组,在数组中插入一个数据元素,使其仍然保持有序。

关键是寻找num在原数组中插入的位置;

当num在原数组中是最大的情况,num应该插入到原数组的末尾。

否则,应该遍历原数组,通过比较原数组元素和num,找到插入位置,进行右移,最后在指定位置上插入num元素。

public class Two {
public int[] SortArray(int[] arr,int num) {
int index = 0;
int[] arr_copy = new int[arr.length+1];
for(int i =0 ;i<arr.length;i++) {
arr_copy[i] = arr[i];
} // 最后一个元素
if(arr_copy[arr.length-1] <= num) {
arr_copy[arr_copy.length-1] = num;
return arr_copy;
} for(int i =0;i<arr.length;i++) {
if(arr_copy[i] > num) {
index = i;
break;
}
} // 将index之后的数据右移,空出index索引指向的空间。
// i > index,不能是i >= index;
// 当index = 0 时,若i >= index,则最后一次循环i = 0,则
// arr_copy[i] = arr_copy[i-1]; 数组越界报错!!!
for(int i = arr_copy.length-1;i > index;i--) {
// index之后的数据向右移动
arr_copy[i] = arr_copy[i-1];
}
arr_copy[index] = num; return arr_copy;
}
public static void main(String[] args) {
int[] arr = {10,12,45,90};
// 加入23后依然是升序
System.out.println("请输入数据:");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
Two obTwo = new Two();
arr = obTwo.SortArray(arr, num);
for(int i = 0; i<arr.length;i++) {
System.out.print(arr[i] + " ");
} } }

韩老师思路:

首先定位,用index表示要插入的位置,遍历原来的数组,如果原来数组元素大于或等于num,index指向该元素的索引。否则,index的值不发生变化,即num是最大值,插入原来数组的末尾。

注意,这里的插入操作有些技巧。

用 i 指针指向新数组,j 指针指向旧数组。当 i 不等于index时,即 i 不是要插入的位置时,arr_copy[ i ] = arr[ i ] ,i++,j++;

当 i 等于index时,即 i 指向了要插入的位置时,arr_copy[ i ] = num ,i++,j不做自增操作。

具体代码如下:

for(int i = 0,j = 0;i<arr_copy.length;i++) {
// 当i!=index时,即不是要插入的位置,
if(i != index) {
arr_copy[i] = arr[j];
j++;
}else {
arr_copy[i] = num;
}
}

操作过程如下,有两个指针i和j,j 指向原来的数组,i 指向新的数组

i++,得i == 1,j++,得 j== 1。

i++,得i == 2,j++,得j == 2。

此时 i == index,则插入新添加的元素。

i++,得i == 3,此时 j 不做自增操作。

i++,得i == 4,j++,得j == 3。

完整代码如下:

public class Two {
public int[] SortArray(int[] arr,int num) {
int index = -1;
int[] arr_copy = new int[arr.length+1];
// 先定位后插入
for(int i=0;i<arr.length;i++) {
if(arr[i] >= num) {
index = i;
break;
}
} if(index == -1) {
index = arr.length;
} for(int i = 0,j = 0;i<arr_copy.length;i++) {
// 当i!=index时,即不是要插入的位置,
if(i != index) {
arr_copy[i] = arr[j];
j++;
}else {
arr_copy[i] = num;
}
} return arr_copy;
}
public static void main(String[] args) {
int[] arr = {10,12,45,90};
// 加入23后依然是升序
System.out.println("请输入数据:");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
Two obTwo = new Two();
arr = obTwo.SortArray(arr, num);
for(int i = 0; i<arr.length;i++) {
System.out.print(arr[i] + " ");
} } }

java顺序数组插入元素的更多相关文章

  1. java去除数组重复元素的方法

    转载自:https://blog.csdn.net/Solar24/article/details/78672500 import java.util.ArrayList; import java.u ...

  2. java 数组插入元素

    import java.util.Arrays; public class AddArray { public static void main(String[] args) { int[] arr ...

  3. Java中数组判断元素存在几种方式比较详解

    1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...

  4. JavaScript 数组插入元素并排序

    1.插入类排序 插入类排序的思想是:在一个已排好序的序列区内,对待排序的无序序列中的记录逐个进行处理,每一步都讲待排序的记录和已排好的序列中的记录进行比较,然后有序的插入到该序列中,直到所有待排序的记 ...

  5. java List 数组删除元素

    在 java 中,ArrayList 是一个很常用的类,在编程中经常要对 ArrayList 进行增.删.改.查操作.之前在学校时一直认为删除操作是最简单的,现在才越发觉得自己愚蠢.只需要设置好预期条 ...

  6. Java查找数组重复元素,并打印重复元素、重复次数、重复元素位置

    面试题查找重复元素并打印重复次数和重复位置,一顿懵逼,回来死磕写下来,打印指定重复次数和最大次数,其他在此基础上可以再更新 package sort; import org.testng.annota ...

  7. C# 往string [] arr 数组插入元素

    string [] arr ; List<string> _list = new List<string>(arr ); for(int i ;i<10;i++) { _ ...

  8. php 数组插入元素

    <?php $a=array("red","green"); array_push($a,"blue","yellow&qu ...

  9. Java方法-数组

    [Java数组] 1. 用sort()方法对Java数组进行排序,及如何使用 binarySearch() 方法来查找数组中的元素 binarySearch() 返回值: 如果它包含在数组中,则返回搜 ...

  10. Java-Runoob-高级教程-实例-数组:02. Java 实例 – 数组添加元素

    ylbtech-Java-Runoob-高级教程-实例-数组:02. Java 实例 – 数组添加元素 1.返回顶部 1. Java 实例 - 数组添加元素  Java 实例 以下实例演示了如何使用s ...

随机推荐

  1. SpringBoot(二) - 核心配置文件

    1.application.properties 和 application.yml 配置文件格式区别 1.1 文件格式 application.properties # 端口号 server.por ...

  2. Springboot 之 Filter 实现超大响应 JSON 数据压缩

    简介 项目中,请求时发送超大 json 数据外:响应时也有可能返回超大 json数据.上一篇实现了请求数据的 gzip 压缩.本篇通过 filter 实现对响应 json 数据的压缩. 先了解一下以下 ...

  3. 基于SqlSugar的开发框架循序渐进介绍(15)-- 整合代码生成工具进行前端界面的生成

    在前面随笔<基于SqlSugar的开发框架循序渐进介绍(12)-- 拆分页面模块内容为组件,实现分而治之的处理>中我们已经介绍过,对于相关的业务表的界面代码,我们已经尽可能把不同的业务逻辑 ...

  4. 基于雪花算法的增强版ID生成器

    sequence 基于雪花算法的增强版ID生成器 解决了时间回拨的问题 无需手动指定workId, 微服务环境自适应 可配置化 快速开始 依赖引入 <dependency> <gro ...

  5. break ,continue,retrun的区别

    break ,continue,retrun的区别 1:break 在循环体内结束整个循环过程 for (var i = 1; i <= 5; i++) { if(i == 3){ break; ...

  6. golang单元测试一(简单函数测试)

    0.1.索引 https://blog.waterflow.link/articles/1663688140724 1.简介 单元测试是测试代码.组件和模块的单元函数.单元测试的目的是清除代码中的错误 ...

  7. 从0搭建vue3组件库:自动化发布、管理版本号、生成 changelog、tag

    今天看到一篇文章中提到了一个好用的工具release-it.刚好可以用在我正在开发的vue3组件库.纸上得来终觉浅,绝知此事要躬行,说干就干,下面就介绍如何将release-it应用到实际项目中,让组 ...

  8. Maven 聚合工程的创建

    简单场景举例 聚合工程创建示例 说明: 创建 Maven Project:表示创建 maven 项目,new Project 方式创建 创建 Maven Module:表示创建 maven 项目,ne ...

  9. 设置CMD命令的初始目录

    本文提供两种方式,第一种通过打开桌面上的快捷方式实现,第二种可以通过 CMD 命令直接进入. 快捷方式 "开始 ---> 程序 ---> 附件",右键单击 " ...

  10. tool1

    //导出 public void excel(List<Long> ids, HttpServletResponse response) { List<StockPageVo> ...