基本思想:将待排序的无序数列看成是一个仅含有一个元素的有序数列和一个无序数列,将无序数列中的元素逐次插入到有序数列中,从而获得最终的有序数列。
算法流程:
1)初始时, a[0]自成一个有序区, 无序区为a[1, ... , n-1], 令i=1;
2)将a[i]并入当前的有序区a[0, ... , i-1];
3)i++并重复2)直到i=n-1, 排序完成。
时间复杂度:O(n^2)。
说明:如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
方法一:
void StraightInsertionSort1(int a[], int n) { int i, j, k; for (i=1; i<n; i++) { for (j=0; j<i; j++) if (a[i] < a[j]) break; if (j != i) { int temp = a[i]; for (k=i-1; k>=j; k--) a[k+1] = a[k]; a[j] = temp; } } }
方法二:
void StraightInsertionSort2(int a[], int n) { int i, j, k; for (i=1; i<n; i++) if (a[i] < a[i-1]) { int temp = a[i]; for (j=i-1; j>=0 && a[j]>temp; j--) a[j+1] = a[j]; a[j+1] = temp; } }
方法三:
void StraightInsertionSort3(int a[], int n) { for (int i=1; i<n; i++) for (int j=i-1; j>=0 && a[j]>a[j+1]; j--) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } }