排序算法:插入排序

1、核心思想

2、时间复杂度:O(n^2)

3、稳定性:稳定

4、空间复杂度:O(n)

5、上代码:

public static void main(String[] args) {
    int[] array = new int[]{12,9,1,6,2,3,91,41,31};
    array = insertSortAsc(array);
    
    for(int data: array){
        System.out.print(data+" ");
    }
}

/**
 *
 1、将数组分成已排序段和未排序段,初始化已排序段只有第一个元素
 2、将未排序段的元素在已排序段中找到位置,在找位置的同时将已排序段"该元素位置"的后面元素的位置后移
 3、将未排序段的元素依次插入已排序段,以保证插入后仍然有序
 4、重复将未排序段的元素在已排序段插入到对应位置,直到未排序段的元素全部加完
 * @param array
 * @return
 */
private static int[] insertSortAsc(int[] array){
    // 数组长度
    int length = array.length;
    // i即为区分已排序段和未排序段的分隔下标
    // 第一个数默认为已排序元素,从第二个元素开始作为未排序段的开始元素
    for(int i=1;i<length;i++){
        // 当前待插入到已排序段的元素
        int data = array[i];

        // 已排序段的末位下标
        int j = i - 1;
        // 从已排序段的末尾开始比较,从后往前比较并进行移位
        for(;j>=0;j--){
            // 当待插入段的元素比前一个元素小,则将前一个元素往后移位
            if(data < array[j]){
                array[j+1] = array[j];
            }else{
                // 当待插入段的元素不比前一个元素小了,移位循环结束
                break;
            }
        }
        // 将当前待插入到已排序段的元素插入到已排序段的对应位置
        array[j+1] = data;
    }

    return array;
}

/**
 *
 1、将数组分成已排序段和未排序段,初始化已排序段只有第一个元素
 2、将未排序段的元素在已排序段中找到位置,在找位置的同时将已排序段"该元素位置"的后面元素的位置后移
 3、将未排序段的元素依次插入已排序段,以保证插入后仍然有序
 4、重复将未排序段的元素在已排序段插入到对应位置,直到未排序段的元素全部加完
 * @param array
 * @return
 */
private static int[] insertSortDesc(int[] array){
    // 数组长度
    int length = array.length;
    // i即为区分已排序段和未排序段的分隔下标
    // 第一个数默认为已排序元素,从第二个元素开始作为未排序段的开始元素
    for(int i=1;i<length;i++){
        // 当前待插入到已排序段的元素
        int data = array[i];

        // 已排序段的末位下标
        int j = i - 1;
        // 从已排序段的末尾开始比较,从后往前比较并进行移位
        for(;j>=0;j--){
            // 当待插入段的元素比后一个元素大,则将前一个元素往后移位
            if(data > array[j]){
                array[j+1] = array[j];
            }else{
                // 当待插入段的元素不比前一个元素小了,移位循环结束
                break;
            }
        }
        // 将当前待插入到已排序段的元素插入到已排序段的对应位置
        array[j+1] = data;
    }

    return array;
}

6、打印结果:
1 2 3 6 9 12 31 41 91
Process finished with exit code 0




***看懂了喜欢的可以点个赞哦,后续还会出新的笔记分享,谢谢大家!
以上内容欢迎评论,欢迎指正。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值