插入排序——1直接插入排序实现

直接插入排序的一种实现:

public IList<int> InsertionSort(int[] ary)
        {
            var len = ary.Length;
            for (int i = 1; i < len; i++)
            {
                var key = ary[i];
                for (int j = 0; j < i; j++)//从前向后找
                {
                    if (key < ary[j])
                    {
                        for (int k = i; k > j; k--)//从后向前逐个移动
                        {
                            ary[k] = ary[k - 1];
                        }
                        ary[j] = key;
                        break;//每次插入一个值后,完成此次遍历
                    }
                }
            }
            return ary.ToList();
        }

这种方法,是从小到大(从左到右)的顺序来寻找插入的位置,每次循环,在已排好的列表中,找到“第一个”,比当前要插入的值大的数,然后从最后一个位置开始,从右向左逐个后移,空出这个比当前值大的数的位置后,将当前值插入进去。然后结束本次的循环。看代码可发现,这种方式写起来略微复杂。

另一种实现方法,是从大到小(从右到左)的顺序来找插入的位置,代码如下:

public IList<int> InsertionSort(int[] ary)
        {
            var len = ary.Length;
            for (int i = 1; i < len; i++)
            {
                var key = ary[i];
                int j = i - 1;
                while (j >= 0 && key < ary[j])//从后往前,一边找一边移动
                {
                    ary[j + 1] = ary[j];
                    j--;
                }
                ary[j + 1] = key;
            }
            return ary.ToList();
        }

外部循环一样,内部循环,每次从最后一个已排好序的元素开始,使用while一边比较一边移动。如果已排序的值小于当前要插入的值,则结束循环。这时要插入的位置也已经疼出来了,只需将当前值插入即可。这里因为每次做了j--,因此在插入的时候,需要先进行加1。

直接插入排序的特点是使用“常数个”额外的内存空间,即空间复杂度为O(1)。而时间复杂度是O(n*n)。

转载于:https://www.cnblogs.com/asenyang/p/6912043.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值