插入排序
文章目录
原理解析:
(这里用升序排序数组举例)
所谓插入排序,顾名思义,从名字上我们就可以知道这种排序算法通过不断的插入数据来排序,那么在一个固定大小的数组中既然有插入数据,那么必然也会有抽出数据。
所谓插入排序,便是以数组一侧作为已排序区域,另一区域为未排序区域,每次从没有排序的数据中抽出一个数据,与已经排序的数据进行比较,将数据插入到合适的位置。
就像我们打扑克牌一样,假设在我们摸牌的时候我们不对手中的扑克牌进行排序,那么最终我们拿到手上的一副牌一定是乱序的,那么这个时候就需要我们从扑克牌的一侧抽出我们的牌,把他插入到已经排好序的一侧扑克牌中,最终完成排序。
对于我们数组中的数据是一样的道理,只要把上述打扑克牌的思路转化为代码就是我们的插入排序,只不过在转化为我们的程序的时候需要对一些细节进行更加的细化。
在将抽出的数据与已经排序好的数据进行比较时. (默认一开始数组中全部都是未排序数据,这里指已经完成部分数据的排序),在没有找到插入位置之前,比插入数据大的已经排好序的数据都要向未排序区域移动一位,以便给插入数据空出位置,当找到比插入数据小的数据时,将插入数据插入到此数据的前一位,以后数据重复此操作完成排序。
代码示例
//low 未排序区域的左边界,默认初始值为0
private static void insertSort(int[] a,int low){
if (low == a.length){//左边界与数组边界重合,说明所有数据全部完成排序
return;
}
int t = a[low];//未排序区域数据
int i = low - 1;//已排序区域指针
while (i >= 0 && a[i] > t){
//结束循环的两种情况
//1.当i=-1时,结束循环,说明数组中没有已经排好序的区域,可以直接插入。
//2.找到比插入数据小的位置,且在当前升序数组中找到了插入位置i+1.
a[i + 1] = a[i];//就是从未排序区域抽出一个数据,而后已排序区域的数据比抽出的数据大的全部右移,给排序数据空出位置
i --;//继续比较已排序区域的下一个数据;
}
//当退出循环说明找到了插入位置
if(i + 1 != low){ //这里说明位置不用变,则不再进行赋值操作
a[i + 1] = t;
}
insertSort(a,low +1);//继续将未排序区域进行排序
}