zoukankan      html  css  js  c++  java
  • 【算法】插入排序法


           每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。

     

           第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。

     

           直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1)。

     

           直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。

     

           值得注意的是,我们必需用一个存储空间来保存当前待比较的数值,因为当一趟比较完成时,我们要将待比较数值置入比它小的数值的后一位插入排序类似玩牌时整理手中纸牌的过程。插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。


    假设我们要对{4,2,3,1}进行排序,那我们该怎么做呢?

    用图来说明:



    我们需要以上abc三步来实现我们的直接插入。相信不用再多做解释了吧!


    可是,放在我们的代码上又是如何实现的呢?

    <span style="font-size:14px;">/**
     *
     *@author 李卫中
     */
    
    //import static java.lang.System.in;
    
    public class Test { 
    
       public static void insertion_sort(int[] unsorted) { //unsorted:未整理的,在这里指的是原始数组,没有经过整理
    
           for (int i = 1; i < unsorted.length; i++)
    
           {
    
               if (unsorted[i - 1] > unsorted[i]) {
    
                    int temp = unsorted[i];        //乘放等待插入的数据
    
                    int j = i;
    
                    while (j > 0 &&unsorted[j - 1] > temp) {  //进行比较,找到自己的合适位置
    
                        unsorted[j] = unsorted[j -1];
    
                        j--;
    
                    }
    
                    unsorted[j] = temp;     //找到位置后,进行赋值
    
               }
    
           }
    
        }
     
    
       public static void main(String[] args) {
    
           int[] x = {4,2,3,1};
    
           insertion_sort(x);
    
           for (int item : x) {
    
               if (item > 0) {
    
                    System.out.print(item +",  ");
    
               }
    
           }
    
        }
    
    }</span>


    运行结果:


    这就是我们的直接插入排序了。

    如果大家有什么意见或者建议,请留言联系!

  • 相关阅读:
    c语言博客作业09
    c语言|博客作业08
    C语言|博客作业07
    C语言|博客作业06
    C语言|博客作业05
    C语言|博客作业04
    C语言|博客作业03
    关于Vue.js里面输入框在v-model之后如果给其绑定属性赋初始值导致绑定数据不响应问题
    前后端分离开发模式中关于前端取得分页数据时的分页问题(前端使用ant design pro)
    《电子病案在病案管理中存在问题及对策》文献阅读随笔
  • 原文地址:https://www.cnblogs.com/DoubleEggs/p/5747179.html
Copyright © 2011-2022 走看看