1、插入排序
它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
我们预留了一个哨兵,这里我们将用到它来保存一个临时值。插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。
插入排序的算法步骤如下:
-
从第一个元素开始,该元素可以认为已经被排序;
-
取出下一个元素,在已经排序的元素序列中从后向前扫描;
-
如果该元素(已排序)大于新元素,将该元素移到下一位置;
-
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
-
将新元素插入到该位置后;
-
重复步骤2~5。
#include <stdio.h> void InsertSort(int* p, int n) { int temp,i,j; for (i = 0; i < n; i++) //每个元素都需要来插入,故比较n次 { temp = p[i]; //设置哨兵,为针对的第i个元素 for (j = i - 1; (j >= 0) && (p[j] > temp); j--) //将于哨兵前面的有序元素进行比较,如果要操作也仅仅是后移 { p[j + 1] = p[j]; } p[j + 1] = temp; //for循环最后会--,所以待插入的位置为j+1 } } int main() { int a[] = { 4,2,5,6,7,8,3,1,9 }; InsertSort(a,9); printf_s("排序后: "); for (int i = 0; i < 9; i++) { printf_s("%d ", a[i]); } return 1; }
空间上只需要一个记录辅助空间,所以关键看时间复杂度
平均比较和移动次数约为(n^2)/4,所以时间复杂度为O(n^2)。
其性能要比冒泡和简单选择排序好些