直接插入排序
2017-03-24 21:08
239 查看
直接插入排序
直接插入排序顾名思义,就是通过将还未进行排序的元素插入到有序序列中进行排序的来使得无序序列有序算法。 直接插入排序的算法执行步骤为:
1、查找出L[i]在L[1]…L[i - 1]的插入位置K
2、将L[K]…L[i - 1]的所有元素向后移动一位
3、将L[i]插入到L[K]处
示意图
相关代码
/** * 直接插入排序算法(L为线性表) * 1、查找出L[i]在L[1]...L[i - 1]的插入位置K * 2、将L[K]...L[i - 1]的所有元素向后移动一位 * 3、将L[i]插入到L[K]处 */ typedef int type; void print_array(type *L, int len, char *msg); /** * 用于交换元素 */ void swap(type *a, type *b) { type tmp = *a; *a = *b; *b = tmp; } /** * L 为type类型的可进行大小对比的线性顺序表 * len 为线性顺序表的长度 */ void insert_sort(type* L, int len) { int key = 0; //哨兵 int i = 0,j; for(i = 1;i < len;i ++) { key = L[i]; for(j = i - 1;j >= 0 && L[j] > key; j --) { L[j + 1] = L[j]; //将元素向后移动 } L[j + 1] = key; print_array(L, ARRAY_SIZE, "排序中:"); } }
效率
空间复杂度:仅仅使用了一个哨兵,因此空间复杂度为O(1)。时间复杂度:
最好时间复杂度:原序列已经有序不需进行交换元素但是比较操作同样进行因此时间复杂度为O(n);
最坏时间复杂度:原序列恰好为预期序列的逆序,总的比较次数为2+…+i,交换次数为2+…+(i + 1)。
平均时间复杂度:去最好与最坏的平均值,因此移动次数约为n*n/4;
直接插入排序的时间复杂度为O(n*n);
稳定性:直接插入排序是稳定的排序算法
适用性:直接插入排序适用于顺序线性表和顺序链表的排序。
相关文章推荐
- 排序算法(一):插入排序(直接插入排序、希尔排序)
- 排序算法之----直接插入排序
- 常用排序算法之二:直接插入排序的两种实现方式
- 直接插入排序
- 排序 -- 直接插入排序
- 排序算法大集锦_插入类――直接插入排序
- 直接插入排序
- 直接插入排序
- 排序算法(三) 直接插入排序与折半插入排序
- 八大排序算法(一)直接插入排序
- 算法实现之直接插入排序与shell排序
- 直接插入算法排序
- Java学习-插入排序1-直接插入排序
- 排序算法之一 直接插入排序
- 排序-插入类排序 - 希尔排序,直接、折半插入排序
- 数据结构:直接插入排序
- 插入排序-直接插入排序、希尔排序
- NOJ1062直接插入排序
- 直接插入排序
- 白话经典算法系列之二 直接插入排序的三种实现