原理
插入排序的思想和我们打扑克摸牌的时候一样,从牌堆里一张一张摸起来的牌都是乱序的,我们会把摸起来的牌插入到左手中合适的位置,让左手中的牌时刻保持一个有序的状态。
那如果我们不是从牌堆里摸牌,而是左手里面初始化就是一堆乱牌呢? 一样的道理,我们把牌往手的右边挪一挪,把手的左边空出一点位置来,然后在乱牌中抽一张出来,插入到左边,再抽一张出来,插入到左边,再抽一张,插入到左边,每次插入都插入到左边合适的位置,时刻保持左边的牌是有序的,直到右边的牌抽完,则排序完毕。
需要排序的元素分为两个区域:已排序区域和未排序区域。开始时,未排序区域是空的,因此可以假设第一个元素已经是排序好的,后面的是未排序的,这样已排序区域就有一个元素了。过程是这样的:选择未排序元素中的第一个元素,与已排序的元素进行比较,通过比较将元素插入合适的位置。随着过程的继续,已排区域元素越来越多,未排区域元素越来越少。
代码实现
python3代码实现
def Insertion(Arr:list):
for i in range(1,len(Arr)):
value=Arr[i]
for j in range(i - 1, -1, -1):
if Arr[j] > value:
Arr[j], Arr[j + 1] = Arr[j + 1], Arr[j]
else:
break
return Arr
c#代码实现
public static void InsertionSort(int[] Arr)
{
int num=Arr.Length;
for(int i=0;i<num;i++)
{
int value=Arr[i];
for(int j=i-1;j>=0,j--)
{
if(Arr[j]>value)
{
int temp=Arr[j];
Arr[j]=Arr[j+1];
Arr[j+1]=temp
}
else
{
break;
}
}
}
}
以上代码亲测无误,如有不妥之处,敬请指正,谢谢!