java实现直接插入排序
一、排序思想
我们假定排序是有小到大排列。直接插入排序的基本思想是:在一个已排好的记录子集的基础上,每一步将下一个待排序的记录有序的插入到已排好的记录子集当中,直接将所有待排记录全部插入位置
例如:
已知待排序的一组记录的初始排列为:{ 49,38,65,49,76,13,27,52}
假设在排序过程中,前三个记录按关键字递增的次序重新排列,构成了一个含有三个记录的有序序列:
{38,49,65}
现在要将第四个记录49插入到上述序列,得到的有序序列:
{38,49,49,49,65}
一般情况下,第i趟直接插入排序的操作为:在含有i-1个记录的有序子序列r[1…i-1]中插入一个记录r[i]后,变成含有i个记录的有序子序列r[1…i]。为了在查找插入位置的过程中避免下标出界,将r[i]记入到r[0]中,将第i个记录的关键字k(i-1),k(i-2),…k(1)进行比较,将所有关键字大于k(i)的记录以此向后移动一个位置,直到遇见一个关键字小于或者等于k(i)的记录k(j),此时k(j)后面必为空位置,将第i个记录插入到空位置即可。
完整的直接插入排序是从i=2开始的,也就是说,将第1个记录视为已排好序的单元素子集合,然后将第2个记录插入到单元素子集合中。i从2循环到n,即可实现完整的直接插入排序。
例如对一组关键字序列{ 49,38,65,49,76,13,27,52}进行插入排序的过程中,每一趟排序之后的状态如下
初始关键字:{ 49,38,65,49,76,13,27,52}
i=2 {(49),38,65,49,76,13,27,52}
i=3 {(38,49),65,49,76,13,27,52}
i=4 {(38,49,65),49,76,13,27,52}
i=5 {(38,49,49,65),76,13,27,52}
i=6 {(13,38,49,49,65, 76)27,52}
i=7 {(13,27,38,49,49,65,76),52}
i=8 {(13,27,38,49,49,52,65,79)}