插入排序算法

插入排序算法的原理:

两个数组,把一个数组拆分成两部分,前面的是有序数组,后面的是无序数组,然后依次把后面无序的数组和前面有序的数组进行比较放到合适的位置,直到把最后一个数放入到有序数组中。

例如:int[] a = {5, 3, 2, 4, 1}, 把分成有序m(为了方便表示)和0无序n,m一开始没有元素,然后把n中的5插入到m中,你会发现5进入时不需要进行比较直接插入就行,所以可以把m设置为一开始存在a中的第一个元素,循环的次数从1开始。插入5之后然后再插入3,3比5小,所以交换位置,交换位置后发现3前面没有数了,所以进行下次的插入操作插入2,2比5小交换位置,2又比3小交换位置...... 一直到最后无序的数组中的元素全部插入到有序数组中。

插入时分两种情况:

1.插入的数小于比较的数交换位置,直到遇到大于比较数的位置。

2.插入的数大于比较的数不用交换,当前位置就是插入数有序数组的位置,然后退出循环。

Java代码:

java 复制代码
package Sort;

public class InsertSort {
    //插入排序方法一:
    public static void insertSort1(int[] a){
        int len = a.length;
        //数组为空或者只有一个元素,则不需要排序
        if(a == null || len < 2){
            return;
        }
        //插入排序0位置已经排序号了,所以从1开始
        for(int i = 1; i < len; i++){
            int newNum = i;
            //从i位置开始,向前寻找插入位置
            //循环条件:newNum左边有数且newNum - 1位置的数比newNum位置的数大
            while(newNum - 1 >= 0 && a[newNum - 1] > a[newNum]){
                Swap(a, newNum - 1, newNum);  //交换位置
                newNum--;  //向左移动继续向前寻找插入位置
            }
        }
    }

    //插入排序方法二:
    public static void insertSort2(int[] a){
        int len = a.length;
        //数组为空或者只有一个元素,则不需要排序
        if(a == null || len < 2){
            return;
        }
        //插入排序0位置已经排序号了,所以从1开始
        for(int i = 1; i < len; i++){
            //新插入的数从排好顺序的最后开始比较
            for(int j = i; j > 0; j--){
                //如果小于交换两个数
                if(a[j] < a[j - 1]) Swap(a, j, j - 1);
                //否则结束循环
                else break;
            }
        }
    }

    public static void Swap(int[] a, int i, int j){
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
    public static void sortprint(int[] a){
        for(int i = 0; i < a.length; i++){
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }
    public static void main(String[] args) {
        int[] a = {5, 3, 2, 4, 1};

        sortprint(a);
        insertSort2(a);
        sortprint(a);
    }
}
相关推荐
Christo31 分钟前
NIPS-2022《Wasserstein K-means for clustering probability distributions》
人工智能·算法·机器学习·数据挖掘·kmeans
xiaolongmeiya6 分钟前
P3810 【模板】三维偏序 / 陌上花开 cdq分治+树状数组
c++·算法
LYFlied10 分钟前
【每日算法】LeetCode 20. 有效的括号
数据结构·算法·leetcode·面试
涛涛北京15 分钟前
【强化学习实验】- Actor-Critic
算法
啊阿狸不会拉杆15 分钟前
《数字图像处理》第 6 章 - 彩色图像处理
图像处理·人工智能·opencv·算法·计算机视觉·数字图像处理
油泼辣子多加17 分钟前
【信创】中间件对比
人工智能·深度学习·算法·中间件
RickyWasYoung21 分钟前
【笔记】矩阵的谱半径
笔记·算法·矩阵
一分之二~25 分钟前
回溯算法--递增子序列
开发语言·数据结构·算法·leetcode
m0_6393972926 分钟前
代码随想录算法训练营第五十天|图论理论基础,深搜理论基础,98. 所有可达路径,广搜理论基础
算法·图论
智驱力人工智能33 分钟前
无人机车辆密度检测系统价格 询价准备 需要明确哪些参数 物流园区无人机车辆调度系统 无人机多模态车流密度检测技术
深度学习·算法·安全·yolo·无人机·边缘计算