【直接插入排序】、【希尔排序】

前言

   直接插入排序最好的例子就是我们在打扑克的时候,比如我第一张摸一张5,第二张摸8(如从大到小),我会把8放到5的后面面,第三张摸一种4,我会把4放到5的前面,第四张摸一张7,我会把7放在5后面,然后又来了一张6,我会把6放在5后面。
这里写图片描述

直接插入排序

插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。
我们可以把第一个数当做有序数组,剩余的为一个无序的数组,依次往里插,依次和有序数组的数做比较。
这里写图片描述

核心代码

  //第一个数为有序,其他数为无序
            for (int i = 1; i < arr.Length; i++)
            {
                int temp = arr[i];
                //依次和有序数做比较
                for (int j = i; j > 0; j--)
                {
                    if (arr[j] < arr[j - 1])
                    {
                        arr[j] = arr[j - 1];
                        arr[j - 1] = temp;
                    }
                }
            }

希尔排序

希尔排序和直接插入排序都属于插入排序,希尔排序又是直接插入排序的一种更高效的改进版本。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

现在有一个数组。
这里写图片描述
初始的增量gap为数组长度的二分之一(如果为小数,向下取整),gap=length/2=5,增量为5则意味着数组被分为5组(同色一组),[8,3][9,5][1,4][7,6][2,0]
这里写图片描述
对这五组分别进行直接插入排序,结果如下,然后增量缩小为gap=5/2=2,意味着数组被分为两组[3,1,0,9,7][5,6,8,4,2]
这里写图片描述
对这两组分贝进行直接插入排序,结果如下,然后增量缩小为gap=2/2=1,意味着数组被分为一组[0,2,1,4,3,5,7,6,9,8]
这里写图片描述
之后再对这组数组进行直接插入排序,只需稍作微调。
这里写图片描述

核心代码

//gap为一个增量,增量的求法为:数组的长度除以2,得到一个gap值,然后再用gap除以2,直到为1,这几个结果
            //称为增量(如果结果为小数,则向下取整,增量也是步长)
            for (int gap = arr.Length / 2; gap >= 1; gap = gap / 2)
            {
                //每个增加都把相应的数放在一个组里,进行直接插入排序。
                for (int i = gap; i < arr.Length; i++)
                {
                    int temp = arr[i];
                    for (int j = i; j >= gap && arr[j] < arr[j - gap]; j = j - gap)
                    {
                        arr[j] = arr[j - gap];
                        arr[j - gap] = temp;
                    }
                }
            }

总结

            还请在评论区提出您宝贵的建议!!

猜你喜欢

转载自blog.csdn.net/ywq1016243402/article/details/82023741
今日推荐