zoukankan      html  css  js  c++  java
  • 插入排序

     (一)什么是插入排序

      插入排序,是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中,从后向前扫描,找到相应的位置并插入。

      如果已经了解了插入排序,那么可以直接进入到总结篇:https://www.cnblogs.com/gdouzz/p/10759399.html

     (二)代码实现

    1、从第一个元素开始,该元素可以认为已经被排序
    2、取出下一个元素,在已经排序的元素序列中从后向前扫描
    3、如果该元素(已排序)大于新元素,将该元素移到下一位置 4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5、将新元素插入到该位置后 6、重复步骤2
    ~5
            static int[] InsertionSort(int[] arr)
            {
                for (var i = 0; i < arr.Length; i++)
                {
                    var tempValue = arr[i];
                    var k = i - 1;
                    for (; k >= 0; k--)
                    {
                        if (tempValue < arr[k])
                        {
                            arr[k + 1] = arr[k];
                        }
                        else
                        {
                            break;
                        }
                    }
                    arr[k + 1] = tempValue;
                }
                return arr;
            }

     (三)时间复杂度分析

    //插入排序     
        //接下来就是 插入排序 
        //插入排序的过程 比如最坏的情况下
        //5,4,3,2,1
        //插入排序,最坏时间复杂度,5,4,3,2,1
        // 插入排序的概念:从未排序的区间里面,选拿一个到已排序的区间里面(可能要进行,元素的比较和移动)。
        //插入排序是一种原地排序的算法。
        //插入排序,分为两个已排序区间和未排序区间
        //插入排序最坏时间复杂度 
        //第一趟:5,4,3,2,1  取出一个4出来,4和5比较一下,比5小,4插入到5的前面。 比较了一次,移动了一次。
        //第二趟:4,5,3,2,1  取出一个3来,3和5比较一下,3比5小,移动一次,3和4比较一次,移动一次,
        //第三趟:3,4,5,2,1  取出一个2来,2和5比较一下,移动一次,2和4比较一次,移动一次,2和3比较一下,移动一次。 
        //第四趟:2,3,4,5,1  取出一个1来,1和5比较一下,移动一次,1和4比较一次,移动一次,1和3比较一次,移动一次,1和2比较一次,移动一次。
        //从这个可以看出。比较次数1+2+3+4  交换次数1+2+3+4  都是o(n²),所以最坏情况下是o(n²);
        //最好情况下,1,2,3,4,5。
        //第一趟,取出一个2来,2和1比较一下,2插入到1后面,移动零次
        //第二趟,取出一个3来,3和2比较,3插入到后面,移动零次
        //第三趟,取出一个4来,4和3比较,4插入到后面,移动零次
        //第四趟,取出一个5来,5和4比较,5插入到后面,移动零次
        //那比较次数是o(n),移动次数0。
  • 相关阅读:
    rsync的man手册(未完成)
    rsync基础
    命令:mktemp
    命令:install
    [Abp vNext 源码分析]
    异常吞噬问题一则
    使用 Polly 实现复杂策略(超时重试)
    在 DotNetty 中实现同步请求
    使用 C# 实现 CJ-T188 水表协议和 DL-T645 电表协议的解析与编码
    DevExpress 使用 GridControl 时,数据源无法立即更新的问题
  • 原文地址:https://www.cnblogs.com/gdouzz/p/10759390.html
Copyright © 2011-2022 走看看