插入排序(Insertion Sort)
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。
算法描述
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5
例子
数组: 3 44 38 47 36 23 27 2
第一次: 3 44 38 47 36 23 27 2
第二次: 3 38 44 47 36 23 27 2
第三次: 3 38 44 47 36 23 27 2
第四次: 3 36 38 44 47 23 27 2
第五次: 3 23 36 38 44 47 27 2
第六次: 3 23 27 36 38 44 47 2
第七次: 2 3 23 27 36 38 44 47
结束
算法复杂度瓬
空间复杂度: O(1)
时间复杂度:
排序稳定,原来相等的两个参数排在前面的依旧是排在前面。
代码实现
public static void insertionSort(int[] arr) {
int len = arr.length;
int preIndex, current;
for (int i = 1; i < len; i++) {
preIndex = i - 1;
current = arr[i];
while(preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex+1] = arr[preIndex];
preIndex--;
}
arr[preIndex+1] = current;
System.out.println(Arrays.toString(arr));
}
}
运行结果
输入数组:int[] arr = {3,44,38,47,36,23,27,2};
[3, 44, 38, 47, 36, 23, 27, 2]
[3, 38, 44, 47, 36, 23, 27, 2]
[3, 38, 44, 47, 36, 23, 27, 2]
[3, 36, 38, 44, 47, 23, 27, 2]
[3, 23, 36, 38, 44, 47, 27, 2]
[3, 23, 27, 36, 38, 44, 47, 2]
[2, 3, 23, 27, 36, 38, 44, 47]
但是按照上面的步骤,这时候我们可以看到和演算结果一致.