插入法排序(Insertion Sort)的基本思想:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子数组中的适当位置,直到全部记录插入完成为止。跟打牌一样,手中的牌都是排好序的,抓了一张牌之后插入到手中排好序的区间里。
如:8 2 4 9 3 6 这样一个待排序的序列经过插入法排序的处理后:
第一轮排序后:2 8 4 9 3 6
第二轮排序后:2 4 8 9 3 6
第三轮排序后:2 4 8 9 3 6
第四轮排序后:2 3 4 8 9 6
第五轮排序后:2 3 4 6 8 9
直接插入法排序是一种稳定的排序方法,适合于原始数据基本有序(正序)的情况。其时间复杂度为O(n2)。对于小规模输入来说,插入排序法是一个快速的排序法。许多复杂的排序法,在规模较小的情况下,都使用插入排序法来进行排序,比如快速排序。
大学时的 c 语言实现版本:
#include<stdio.h>
void insertionSort(int a[], int n)
{
//序列中公n个数,所以要进行n-1次插入
int i, j, key;
//从序列中的第二个数开始
for (i = 1; i < n; i++)
{
if (a[i] < a[i-1]) //否则无需进行插入操作,因为这两个数的大小关系确定,位置不用变化
{
key = a[i];
j = i-1;
while (j >= 0 && key < a[j])
{
a[j+1] = a[j];
a[j] = key;
j--; //j--后去看下一个数和key的大小情况, 如果满足条件,交换之
}
}
}
}
int main()
{
int a[7] = {8, 2, 4, 9, 3, 6, 10};
int i;
insertionSort(a, 7);
for (i = 0; i < 7; i++)
printf("%d\t", a[i]);
printf("\n");
return 0;
}
工作以后的 Java 版本:
public class SortDemo {
public static void main(String[] args) {
int[] arr = {100, 90, 80, 70, 60, 55, 45, 35, 10, 20, 20, 25};
insertSort(arr);
System.out.println(Arrays.toString(arr));
}
private static void insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
// 当前的元素
int key = arr[i];
// 将元素擦入已经排好序的集合中
int j = i - 1;
for (; j >= 0; j--) {
if (arr[j] > key) {
// 移动位置
arr[j + 1] = arr[j];
} else {
break;
}
}
// 擦入元素
arr[j + 1] = key;
}
}
}