• 基于比较的算法之三:插入排序


    插入排序的思想是:

    1。假设第一个元素是有序的,理解这个有序是针对只有这一个元素。

    2。然后依次拿出后面元素插入到前面元素构成的有序序列里面(这个过程保证了算法的稳定性,因为遇到等于小于自己的时候就停止插入操作)。

    3。直到最后一个元素插入到插入到前面的有序序列,完毕。

    时间复杂度分析:

    假设数组有n个元素

    最好情况:n个元素是逆序的,则每个元素需要2次比较,3次数据移动

    所以总次数为5(n-1)次(第一个元素不用比较了)

    时间复杂度为O(n)

    最坏的情况,n个元素是已经拍好顺序的,则第i个元素需要比较的次数是i次,0次数据移动,i=0,1,2...(n-1)

    所以比较次数总数Cmax=n(n-1)/2

    时间复杂度为O(n2

    下面给出C#的通用插入排序算法实现:

    startIndex为排序区间的数组元素下标,通常为0,
    endIndex为排序区间的数组元素下标,通常为array.Length-1
        public class InsertionSort<T> where T : IComparable<T>
        {
            public void Sort(T[] array, int startIndex, int endIndex)
            {
                //假定startIndex的值已经在正确位置
                for (int i = startIndex; i <= endIndex; i++)
                {
                    T tmp = array[i];//待插入数据
                    int targetIndex = i;//当前位置为寻找起点
                    while (targetIndex > startIndex && array[targetIndex - 1].CompareTo(tmp) > 0)
                    {
                        array[targetIndex] = array[targetIndex - 1];//已排好顺序的序列依次向右移位  
                        targetIndex--;//此待选位置空出
                    }
                    array[targetIndex] = tmp;
                }
            }
        }

    作者:Andy Zeng

    欢迎任何形式的转载,但请务必注明出处。

    http://www.cnblogs.com/andyzeng/p/3684066.html

     
  • 相关阅读:
    Git安装(操作篇)
    Git安装
    ES6基础练习
    SVN的安装与搭建及使用
    解决SVN文件不显示绿色小钩图标问题
    混入(mixin)
    ref属性与props配置项
    docker-compose部署 Mysql 8.0 主从模式基于GTID
    项目统一处理
    Docker Compose实战
  • 原文地址:https://www.cnblogs.com/andyzeng/p/3684066.html
Copyright © 2020-2023  润新知