博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
直接插入排序
阅读量:5340 次
发布时间:2019-06-15

本文共 1377 字,大约阅读时间需要 4 分钟。

直接插入排序法介绍

直接插入排序(Straight Insertion Sort)的基本操作是:将一个元素插入到已经排好序的有序表中。比如有n个待排序的元素,把第一个元素当作有序表的第一个元素,后面的n-1个元素表示未排序的元素,排序过程中每次从未排序的元素中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。

图解直接插入排序

第一次:将数组中的第一个元素当作a[0]当作有序表的第一个元素,剩下的元素当作无序元素

第二次:将数组中剩下元素中的第一个元素a[1]与有序表中的最右边的元素a[0]比较,a[1]大于a[0],插在a[0]的右边。

第三次:将数组中剩下元素中的第一个元素a[2]与有序表中的最右边的元素a[1]比较,a[2]小于a[1],继续与a[0]比较,a[2]小于a[0],将a[0]和a[1]往右移一位,将a[2]插入原本a[0]的位置。

依次类推,知道数组中的所有元素都变为有序。

直接插入排序实现

#include
#define MAXSIZE 10 //用于排序的数组个数的最大值,可修改#define OK 1#define TRUE 1#define FALSE 0typedef int Status; //定义一个用于排序的顺序表结构typedef struct { int r[MAXSIZE]; int length; //用于记录顺序表的长度}SqList;//对顺序表做直接插入排序void InsertSort(SqList *L){ int i , j; for(i = 1; i <= L->length; i++){ //选择排序核心代码 if(L->r[i] < L->r[i - 1]){ int temp = L->r[i]; for(j = i - 1; L->r[j] > temp && j >= 0; j--){ L->r[j + 1] = L->r[j]; //元素后移 } L->r[j + 1] = temp; //将最小元素插入到正确的位置 } }}

算法复杂度和稳定性分析

最好的情况是序列本身是有序的,也就是没有移动的次数,只有比较的次数,时间复杂度是O(n)。最坏的情况是序列是倒序的,此时比较的时间复杂度为n2 /2。移动的时间复杂度为n2⁄ 2因此其时间复杂度是O(N2)

如果排序记录是随机的,那么根据概率相同的原则,平均比较和移动次数约为n2/4次。从这里也看出,同样的 O(n2)时间复杂度,直接插入排序法比冒泡和简单选择排序的性能要好一些。

直接插入排序是稳定的算法,它满足稳定算法的定义:假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

 

转载于:https://www.cnblogs.com/yuliangbin/p/8881930.html

你可能感兴趣的文章
php基础随记
查看>>
WWF(1)
查看>>
2016蓝桥杯决赛 机器人塔(会超时)
查看>>
vue中过滤器filter的使用
查看>>
vue中v-show与v-if的区别
查看>>
time模块
查看>>
已知树的前序中序求后序,或者已知树的中序后序求前序(1)
查看>>
构建之法 阅读笔记06
查看>>
vhdl rising_edge(clk) (clk'event and clk='1')的区别
查看>>
LoadRunner补丁Patch4下载
查看>>
七 Hibernate5种查询检索方式,单表&多表
查看>>
【tyvj1305】最大子序和
查看>>
面试总结一
查看>>
Logging模块的简单使用 Python
查看>>
【程序47】
查看>>
win7下自动更新svn目录
查看>>
关于Repository模式
查看>>
2019世界乒乓球锦标赛女单刘诗雯夺冠
查看>>
poj1330 Nearest Common Ancestors
查看>>
mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI
查看>>