• 排序算法-插入排序


    插入排序是一种最简单直观的排序算法,依次选择待排序元素,往前面的有序序列中插入。

    1.代码实现

    以java实现为例:

    public class InsertSort {
        public static int[] insertSort(int[] nums) {
            for (int i = 1; i < nums.length; i++) {
                int pos = i -1 ;    //有序序列的最后一个元素位置
                int cur = nums[i];    //保存待排序元素的值
                //从有序序列往前遍历,碰到大于当前元素的元素时,则将被比较元素下标往后移动一位
                while ( pos >= 0 && nums[pos] > cur) {
                    nums[pos + 1] = nums[pos];
                    pos--;
                }
                nums[pos + 1] = cur;    //在遍历中找到适合当前排序元素的位置时,将待排序元素插入数组中
            }
            return nums;
        }
    
        public static int[] insertSort1(int[] nums) {
            //从第2个元素,即下标1 开始排序,左边是已经排好的有序序列,右边是待排序序列
            for (int i = 1; i < nums.length; i++) {
                //从有序序列的最大值开始向前遍历,与待排序元素比较,直到找到一个适合的位置,跳出循环
                for (int j = i; j > 0 && nums[j] < nums[j-1]; j--) {
                    int temp = nums[j];
                    nums[j] = nums[j-1];
                    nums[j-1] = temp;
                }
            }
            return nums;
        }
    
        public static void main(String[] args) {
            int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10 };
            int[] newNums = insertSort(nums);
            for (int x : newNums) {
                System.out.print(x+" ");
            }
        }
    }

    上面的代码提供的两种写法本质上是一样的。

    2.数据运行解析 

    数据的分解示例如下

    [9 8 7 6 5 4 3 2 10]   以第二个元素,即i=1的元素8开始,与左边有序序列[9]进行遍历比较,并且交换
    ->[8 9 7 6 5 4 3 2 10] 以第三个元素,即i=2的元素7开始,与左边有序序列[8 9]进行遍历比较,并且交换
    ->[8 7 9 6 5 4 3 2 10] ...
    ->[7 8 9 6 5 4 3 2 10] 以第四个元素,即i=3的元素6开始,与左边有序序列[7 8 9]进行遍历比较,并且交换
    ->[7 8 6 9 5 4 3 2 10] ...
    ->[7 6 8 9 5 4 3 2 10] ...
    ->[6 7 8 9 5 4 3 2 10] 
    ....

    3.复杂度分析

    插入排序在序列已经有序的情况下有最好时间复杂度O(n),最差和平均时间复杂度都是O(n²),空间复杂度为T(1)。

    4.插入排序和冒泡排序的区别

    以 [ 4 3 2 1 ] 序列为例,使用参考资料4中的冒泡排序实现代码

    冒泡排序的排序路线为:

    4 3 2 1
    3 4 2 1
    2 4 3 1
    1 4 3 2
    1 3 4 2
    1 2 4 3
    1 2 3 4 

    冒泡排序的思路是,嵌套两层循环,对每个元素开始两两排序,直到比对完序列尾部的两个元素。

    插入排序的排序路线为:

    4 3 2 1
    3 4 2 1
    3 2 4 1
    2 3 4 1
    2 3 1 4
    2 1 3 4
    1 2 3 4 

    插入排序的思路是,从第二个元素开始,跟左边的有序序列进行比对,找到合适的位置并插入。

    参考资料:

    1)https://baike.baidu.com/item/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F/7214992?fr=aladdin

    2)https://www.cnblogs.com/lanhaicode/p/11259509.html

    3)https://www.cnblogs.com/AraragiTsukihi/p/6339928.html

    4)https://www.cnblogs.com/cykfory/p/14097100.html

  • 相关阅读:
    asp.net中页面传值的几种经典方法
    关于ASp.NEt方面的好书,不得不看啊!!!
    Qt Creator 窗体控件自适应窗口大小布局
    自己动手打造T9510E EMUIB502新功能
    OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
    Qt 中获取本机IP地址
    嵌入式Linux中GPS信息读取与处理
    OpenCV 学习资源整理
    新Outlook邮箱的客户端设置
    Qt 中显示中文
  • 原文地址:https://www.cnblogs.com/cykfory/p/14098077.html
Copyright © 2020-2023  润新知