当前位置: 首页 > news >正文

小小c#算法题 - 5 - 插入排序

插入排序是最简单(最容易理解)的一种排序算法。

其基本操作是将一个数插入到已经有序的数组中,那么我们要做的是确定插入到什么位置,所有在这个位置之后的数后移一个位置,从而给这个要插入的数腾出位置。所以关键点是找插入位置。

最简单的办法,从最后一个元素开始找,边找边后移,一直到找到合适的插入位置。

首先,数组第一个元素我们视为有序。第二个元素,跟第一个比较排序之后,前两个元素组成一个有序序列。第n个元素,从前面的有序序列(n-1个元素)的最后一个元素开始比较,直到找到合适的插入位置,插入即可,最终形成一个有序序列。

 代码(c#):

        static void InsertSort(int[] numbers)
        {
            int temp, j;
            for (int i = 1; i < numbers.Length; i++)
            {
                temp = numbers[i];
                j = i;
                while (j > 0 && numbers[j - 1] > temp)
                {
                    numbers[j] = numbers[j - 1];
                    j--;
                }

                numbers[j] = temp;
            }
        }

  

还有一种稍高效一点的方法,因为我们要插入的数组已经是有序的了,所以可以用二分查找找到插入位置,然后后移这个位置之后的元素,插入新值。

代码(c#):

        static void BinaryInsertSort(int[] myArray)
        {
            for (int i = 1; i < myArray.Length; i++)
            {
                if (myArray[i] < myArray[i - 1])
                {
                    int low = 0;
                    int high = i - 1;
                    int mid = (low + high) / 2;

                    // 找到插入位置 low
                    while (low <= high)
                    {
                        if (myArray[i] >= myArray[mid])
                        {
                            low = mid + 1;
                            mid = (low + high) / 2;
                        }

                        if (myArray[i] < myArray[mid])
                        {
                            high = mid - 1;
                            mid = (low + high) / 2;
                        }
                    }

                    // 将插入位置后面的元素后移一个位置,后移之前保存要插入的值myArray[i]
                    int temp = myArray[i];
                    for (int j = i; j > low; j--)
                    {
                        myArray[j] = myArray[j - 1];
                    }

                    myArray[low] = temp;
                }
            }
        }

 

最后,从代码可以看出。直接插入排序的时间复杂度是O(n*n)。虽然折半插入排序减少了关键字间的比较次数,但移动记录的次数不变,所有时间复杂度仍是O(n*n)。

转载于:https://www.cnblogs.com/CSharpSPF/archive/2012/04/05/2433886.html

相关文章:

  • 线程启动 [转]
  • PSP Skype 使用国内卡
  • php.ini 中文版[转]
  • 使用StyleCop进行代码审查
  • wcf服务代理层添加wcf服务异步代理
  • 检测是否支持position:fixed
  • [译]学习IPython进行交互式计算和数据可视化(三)
  • 【PSY】 [歌詞] 父親
  • 一步一步学Remoting之三:复杂对象
  • linux下查看磁盘空间
  • Greenplum table 之 appendonly的列存储表
  • 云计算实验(二)Hadoop 练习
  • 云计算实验(三)CloudSim练习
  • 信息安全实验一:DES分组密码算法 2019.03.21
  • 信息安全实验二:分组密码工作模式 2019.04.15
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【391天】每日项目总结系列128(2018.03.03)
  • 2018一半小结一波
  • 78. Subsets
  • centos安装java运行环境jdk+tomcat
  • co模块的前端实现
  • Flex布局到底解决了什么问题
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • Git学习与使用心得(1)—— 初始化
  • Java到底能干嘛?
  • magento2项目上线注意事项
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • spring学习第二天
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Wamp集成环境 添加PHP的新版本
  • 百度小程序遇到的问题
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 记录一下第一次使用npm
  • 通过git安装npm私有模块
  • 我与Jetbrains的这些年
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​如何在iOS手机上查看应用日志
  • #1015 : KMP算法
  • (1)(1.11) SiK Radio v2(一)
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (七)c52学习之旅-中断
  • (转)程序员疫苗:代码注入
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET企业级应用架构设计系列之开场白
  • .NET上SQLite的连接
  • .net中的Queue和Stack
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @Documented注解的作用
  • [Angular] 笔记 21:@ViewChild
  • [C#]扩展方法
  • [C++]priority_queue的介绍及模拟实现
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [git] windows系统安装git教程和配置