介绍
插入排序类似于排序我们手中的卡片。
假设第一张卡片已经排序,然后选择一张未排序的卡片,如果未排序的卡片大于排序的卡片,那么放在右边,否则放在左边。同样的方法,将所有未排序的卡片放到正确的位置上。
相似的方法应用到插入排序中。插入排序时一种排序算法,放未排序的元素到正确的位置。
工作原理
有如下需要排序的数组
- 数组中的第一个元素假设已经排序,得到第二个元素的值,存储到名为key的变量中,对比key与第一个元素,如果第一个元素大于key,那么key放在第一个元素之前。
- 目前两个元素已经排序
得到第三个元素,它与他左边的元素进行对比,放它到小于它的元素之后,如果没有元素小于它,那么放它到数组的开始。
3. 类似的方法,放每个未排序的元素到正确的位置
插入排序算法
insertionSort(array)
mark first element as sorted
for each unsorted element X
'extract' the element X
for j <- lastSortedIndex down to 0
if current element j > X
move sorted element to the right by 1
break loop and insert X here
end insertionSort
Java实现
// Insertion sort in Java
import java.util.Arrays;
class InsertionSort {
void insertionSort(int array[]) {
int size = array.length;
for (int step = 1; step < size; step++) {
int key = array[step];
int j = step - 1;
while (j >= 0 && key < array[j]) {
// For descending order, change key<array[j] to key>array[j].
array[j + 1] = array[j];
--j;
}
array[j + 1] = key;
}
}
public static void main(String args[]) {
int[] data = { 9, 5, 1, 4, 3 };
InsertionSort is = new InsertionSort();
is.insertionSort(data);
System.out.println("Sorted Array in Ascending Order: ");
System.out.println(Arrays.toString(data));
}
}
时间复杂度
- 最坏情况:O(n^2)
- 最好情况:O(n)
- 平均情况:O(n^2)
使用场景
- 适合数组拥有比较少的元素
- 仅仅需要排序数组中的部分元素