插入排序
1 public int[] insertSort(int[] arr) { 2 /** 3 * 插入排序: 4 * 算法思想:从第二个元素开始到最后一个元素,取出元素,依次与它前面的元素比较(从后往前),如果大于等于,插入,反之则将该位置的元素向后移动,继续与前一个比较直至插入 5 * 时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 稳定性:稳定 8 */ 9 for (int i = 1; i < arr.length; i++) { //从第二个元素开始,n-1次插入 10 int temp = arr[i]; //每趟将arr[i]插入到前面的排序子序列中 11 int j;//j初始化为当前元素的前一个 12 for (j = i -1; j >= 0 && temp < arr[j]; j--) { 13 arr[j+1] = arr[j ];//***### //在到达第一个元素之前且当前元素(i)小于依次比较的元素,将前面较大的元素向后移动。 14 } 15 arr[j + 1] = temp; //temp值到达插入位置 16 } 17 return arr; 18 }
例子:
5 | 4 | 2 | 7 | 12 | 0 | 9 | 6 |
从第二个元素开始,与前面的元素比较,(按从小到大排序),如果大于,则把当前元素保存起来,将前面的元素依次向后移动,然后插入因为右移动所产生的那个空缺
第1次:
4 | 5 | 2 | 7 | 12 | 0 | 9 | 6 |
第2次:
2 | 4 | 5 | 7 | 12 | 0 | 9 | 6 |
这样迭代下去就可以了
注意:每次移动的前提是前面的数组元素都是已经按顺序排列好了