插入排序算法的讲解和实现

插入排序算法的讲解和实现

插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序,时间复杂度为O(n²),且是稳定的排序算法.
这里要注意,我们说的O(n²)是指最坏时间复杂度,如果这个数组整体本来是有序的,这属于最好情况,这时候的时间复杂度就是O(n),因为不需要交换了。所以相对于冒泡排序来说,插入排序的算法还是要好一些的
动图演示:
动图演示
在这里插入图片描述

			//插入排序,时间复杂度为O(n²),且是稳定的排序算法
        static void InsertSort(int[] array)
        {   //将数组分为两组,一组是已经排好序的(我们称为A组)另一组是还没有排好序的(称为B组)
            //在数组的刚开始,我们把数组的第一个元素array[0]将入A组,剩下的放入B组
            //从数组的第二个元素开始,逐步与A组的元素相比较(从A组的后边往前边比较)
            for (int i = 1; i < array.Length; i++)
            {
                int ivalue = array[i];//定义ivalue存储要插入的值
                bool isInsert = false;//定义一个bool标志位作为判断是否已经插入
                for (int j = i-1; j >=0; j--)//逐步与A组的元素相比较(从A组的后边往前边比较)
                {
                    if(array[j]>ivalue)//如果A组中的值大于要比较的值,A组就整个数组往后移动一个位置
                    {
                        array[j + 1] = array[j];
                        //这样的移动当然会覆盖A组后边的那个元素的值,
                        //但是别忘了A组后边的那个元素,是要插入的值原本的位置,
                        //所以往后移动只会覆盖这个位置,不会对整个数组产生影响
                    }
                    else//如果ivalue小于等于array[j],就不用继续移动了
                    {
                        array[j + 1] = ivalue;//此时ivalue就插入在了这个不比它大的元素(array[j])的后边,即array[j+1]
                        isInsert = true;//标志位为true
                        break;
                    }
                }
                if(isInsert==false)//如果所有的A组数据都比较完了还没有插入,说明ivalue最小了,放在数组最开头
                {
                    array[0] = ivalue;
                }
            }
        }
        static void Main(string[] args)
        {
            int[] array = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
            InsertSort(array);
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write(array[i] + " ");
            }
            Console.ReadKey();
        }

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值