学习自严蔚敏、吴伟民的《数据结构》-清华大学出版
最简单的排序方法。基本操作是将一个记录插入到已排序好的有序表中,从而得到一个新的、记录数增1的有序表。
先看代码:
public static int[] insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// arr[i]需要向前移动
if (arr[i] < arr[i - 1]) {
int temp = arr[i];
int j = i - 1;
// 比temp(arr[i])大的值向后移动一位
System.out.println(i + "-"+j);
for (; j >= 0 && arr[j] > temp; j--) {
arr[j + 1] = arr[j];
}
// **for循环中j--后才判断,所以需要+1
arr[j + 1] = temp;
}
}
return arr;
}
简单说明(语言组织不是很好):
在最外层循环,i的值逐渐递增,每增加1,就判断arr[i] < arr[i - 1]
false:说明数组中下标0~i,值是递增的,因此不需要交换值,循环继续
true:说明下标i处的值应该插入数组下标0~(i-1)之间,此时将i处的值赋给中间变量-temp,内层循环从j(i-1)处开始向前循环,直到j >= 0 && arr[j] > temp为止,结束本次内层循环,并将temp的值赋给arr[j + 1],即:arr[j + 1] = temp;
整个排序过程为进行n-1趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。
从空间来看,只需要一个额外的空间-temp;从时间来看,排序的基本操作为:比较两个关键字的大小和移动记录,总的来说,直接插入排序的时间复杂度为O(n2)。
举个例子: