java顺序数组插入元素

导读:本篇文章讲解 java顺序数组插入元素,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

one

 

 关键是寻找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 指向新的数组

vip

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

vip

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

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

vip

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

vip

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

vip

完整代码如下:

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] + " ");
        }
        
    }

}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/98995.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!