插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
包括:直接插入排序,二分插入排序(又称折半插入排序),链表插入排序,希尔排序(又称缩小增量排序)。属于稳定排序的一种(通俗地讲,就是两个相等的数不会交换位置) 。
使用插入排序为一列数字进行排序的过程 | |
分类 | 排序算法 |
---|---|
数据结构 | 数组 |
最差时间复杂度 | |
最优时间复杂度 | |
平均时间复杂度 | |
最差空间复杂度 | 总共 ,需要辅助空间 |
最佳算法 | No |
1 void insert_sort(int *array, int n) 2 { 3 int i,j; 4 int temp; 5 for(i = 1; i < n; i++) 6 { 7 temp = *(array + i); 8 for(j = i;j > 0 && *(array + j - 1) > temp;j--) 9 { 10 *(array + j) = *(array + j - 1); 11 } 12 *(array + j) = temp; 13 } 14 } 15 void InsertSortArray(int arr[], int n) 16 { 17 for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分 18 { 19 int temp=arr[i];//temp标记为未排序第一个元素 20 int j=i-1; 21 while (j>=0 && arr[j]>temp)/*将temp与已排序元素从小到大比较,寻找temp应插入的位置*/ 22 { 23 arr[j+1]=arr[j]; 24 j--; 25 } 26 arr[j+1]=temp; 27 } 28 }