简介
/**
插入排序算法:<br />
思路:假设某元素之前的子序列有序,该元素如果大于子序列末端元素则可继续下一个元素;如果该元素小于子序列末端,则往前插入到指定位置<br />
第一趟:第一个元素已经有序<br />
第二趟:第二个元素往前插<br />
第三趟:第三个元素往前两个元素插<br />
……<br />
* 时间复杂度:O(n²)=1+2+3+...+n-1<br />
* 空间复杂度:O(1)<br />
* 原址排序<br />
* 稳定性:由于是从后往前,后续元素如果存在前面相等的,无法越过,相对位置不会发生变化<br />
*/
普通解法
public static void sort(int[] arr, int low, int high) {
for (int j = low + 1; j <= high; j++) {
int key = arr[j];
int pre = j - 1;
while (pre >= low && arr[pre] > key) {
arr[pre + 1] = arr[pre];
pre--;
}
arr[pre + 1] = key;
}
}
static void sortInverse(int[] arr, int low, int high) {
for (int j = low + 1; j <= high; j++) {
int key = arr[j];
int pre = j - 1;
while (pre >= low && arr[pre] < key) {
arr[pre + 1] = arr[pre];
pre--;
}
arr[pre + 1] = key;
}
}
递归解法
public class 插入排序改递归 {
public static void main(String[] args) {
int a[] = {3,1,9,8,6,7};
insertSort(a, 5);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] +" ");
}
}
private static void insertSort(int[] a, int k) {
if (k == 0) {
return;
}
insertSort(a, k - 1);
int x = a[k];
int index = k - 1;
while (index > -1 && x < a[index]) {
a[index + 1] = a[index];
index--;
}
a[index + 1] = x;
}
}
分析
/**
* 对数组排序
* 等价于:
* 对数组的0~倒数第二个元素,这部分排序
* 然后把最后一个元素插入到这个有序的部分中
*/
总结
找重复
1、找到一种划分方法
2、找到递推公式或者**等价转换**
都是父问题转化为求解子问题
找变化的量
变化的量通常要作为参数
找到出口
根据参数变化的趋势,对边界进行控制,适时终止递归