前言
直接插入排序最好的例子就是我们在打扑克的时候,比如我第一张摸一张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;
}
}
}
总结
还请在评论区提出您宝贵的建议!!