直接插入排序(Straight Insertion Sort)是一种很简单的排序算法。它的核心思想是:将已知数组元素插入到有序序列的合适位置中,从而形成一个新的有序序列。
直接插入排序算法思想:
将已知数组元素插入到有序序列的合适位置中,从而形成一个新的有序序列。
直接插入排序算法举例:
以序列A:{ 1,2,4,6,3 }为例,叙述一遍直接插入排序的算法流程。
1.1 首先寻找有序序列
首先我们通过一次循环,找到{ 1,2,4,6 }为有序序列,而加上最后一个元素{ 3 }则为无序序列,因此,我们要对最后一个元素进行寻找它正确的位置。
1.2 设置变量存储无序元素的值
此时得知,元素a[4]为无序元素,因此设置一个变量 temp ,存储a[4]的值
1.3 寻找无序元素正确的位置
此时,我们应该寻找无序元素的正确位置。这时候,我们拿无序元素之前的每一个元素(本例中即a[3],a[2],a[1],a[0])与之(temp)比较,若大于之,则该元素后移。
本例中,
a[3]>temp,则a[3]后移,即a[3]的值赋予a[4]。
然后比较a[2],a[2]>temp,则a[2]后移,即将a[2]的值赋予a[3]。
然后比较a[1],a[1]<temp,则temp应该放到a[2]处,即a[2]=temp;
排序结束。
代码实现:
#include<stdio.h> //输出数组 void printArr(int a[], int n) { for (int i = 0; i < n; i++) { printf("%d--", a[i]); } printf(" "); } // 直接插入排序 void InsertSort(int *a, int n) { int i, j, temp; for (int i = 1; i < n; i++)//从第二个元素开始,依次与前一个元素比大小 { if (a[i] < a[i - 1])//若前面的元素大于后面的元素,则寻找后面元素本应正确的位置 { temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) { a[j + 1] = a[j]; } a[j + 1] = temp;//将无序元素放入到正确的位置 } } printArr(a, n); } void main() { //直接插入 int aa[] = { 1,2,4,6,3 }; int n = sizeof(aa) / sizeof(aa[0]); InsertSort(aa, n); getchar(); }
时间复杂度:
最好情况:O(n)
最坏情况:O(n^2)
平均情况:O(n^2)
稳定性:
直接插入排序是一种稳定的排序算法。