插入排序

 (一)什么是插入排序

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

  如果已经了解了插入排序,那么可以直接进入到总结篇: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。
原文地址:https://www.cnblogs.com/gdouzz/p/10759390.html