Fork me on GitHub

基础算法之插入排序Insertion Sort

原理

通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。相信大家都打过扑克牌,很好理解。

例子

将数组[5,6,3,1,8,7,2,4]进行从小到大排序

排序步骤:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤2~5

 

动画演示

代码参考

复制代码
     static void Main(string[] args)
        {
            int[] intArray = { 3, 6, 4, 2, 5, 1 };
            Insertion_Sort(intArray);

            foreach (var item in intArray)
            {
                Console.WriteLine(item);
            }
            Console.ReadLine();
        }

        static void Insertion_Sort(int[] unsorted)
        {
            int i, j, temp;
            for (i = 1; i < unsorted.Length; i++)
            {
                // 检查有无序状态
                if (unsorted[i-1] > unsorted[i])
                {
                    temp = unsorted[i];
                    // 移位
                    for (j = i; j > 0 && unsorted[j - 1] > temp; j--)
                    {
                        unsorted[j] = unsorted[j - 1];
                    }
                    // 强势插入
                    unsorted[j] = temp;
                }
            }
        }
复制代码

参考资料

维基百科http://en.wikipedia.org/wiki/Insertion_sort

posted @   Jackbase  阅读(788)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示