最近做一个排序中间件,所以需要研究排序算法,而且重点是要实现出来。

实现算法语言为C语言,使用环境为VS2010集成环境。

待排记录数据类型:

//数据
#define MAXSIZE 20
typedef int KeyType;
typedef int InfoType;
typedef struct{KeyType key;            //关键字项InfoType otherinfo;        //其他数据项
}RedType;                    //记录类型
typedef struct{RedType r[MAXSIZE+1];    //r[0]闲置或用作哨兵单元int length;                //顺序表长度
}SqList;                    //顺序表类型

最简单的插入排序

直接插入排序:将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数字增1的有序表

直接插入排序理论比较简单,算法也比较简单。

//插入排序
void InsertSort(SqList &L){//对顺序表L作直接插入排序for(int i=2;i<=L.length;i++){if(LT(L.r[i].key,L.r[i-1].key)){L.r[0]=L.r[i];L.r[i]=L.r[i-1];}int j=i-2;for(;LT(L.r[0].key,L.r[j].key);j--){L.r[j+1]=L.r[j];}L.r[j+1]=L.r[0];}
}

函数LT(int,int)是比较的内容。根据数据类型比较,这里有一个整型大小比较的例子。

bool LT(int x,int y){if(x<y)return true;elsereturn false;
}

测试

为了便已测试,下面给一个完整的测试代码

插入排序算法实例

关于插入排序的效率

空间:S(1),直接插入排序只需要一个辅助空间。

时间:排序的基本炒作为,1.比较关键字的大小;2.移动记录

最好情况:当记录已经是有序而且序列就是所求顺序的时候,第二个for循环将不会被运行,整体空间复杂度为O(n)

最坏情况:当记录和需要得出的序列刚好相反时,第二个for循环被执行的次数最多,比较次数为(2,3,...,n)次,即(n+2)(n-1)/2,移动次数为(2,3,...,n,n+1),即(n+4)(n-1)/2。

平均次数大约为n2/4,即时间复杂度为O(n2)

参考资料

[1] 严蔚敏 吴伟民 《数据结构(C语言版)》 北京:清华大学出版社,1997.4

本文转自 Ron Ngai 博客园博客,原文链接:http://www.cnblogs.com/rond/archive/2012/04/16/2452729.html  ,如需转载请自行联系原作者

内部排序——直接插入排序相关推荐

  1. 10-1-直接插入排序-内部排序-第10章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第10章  内部排序 - 直接插入排序 --<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课 ...

  2. prim算法适用条件_内部排序算法的比较及应用

    "内部排序包括        插入排序(直接插入排序.折半插入排序.希尔排序),        交换排序(冒泡排序.快速排序),        选择排序(简单选择排序.堆排序),       ...

  3. 内部排序算法全面总结

    排序的概念 排序,就是重新排列表中的元素,使表中的元素按照关键字有序的过程. 我所了解的 表 多半是顺序表,因为顺序表实现较为简单,但是链表结构同样可以实现很多排序算法. 定义中的元素一般指什么元素呢 ...

  4. 内部排序与外部排序简单比较

    前言 本篇文章主要介绍内部排序与外部排序的知识,如果你和我一样还不知道内部排序和外部排序为何物的话,不妨看看我的理解 正文 由于待排序的记录数量不同,使得排序过程中涉及的存储器不同,可将排序方法分为两 ...

  5. 直接插入排序(内部排序)

    1 package com.trfizeng.insertionsort; 2 3 /** 4 * 5 * @author trfizeng 内部排序 插入排序 --- 直接插入排序(Straight ...

  6. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...

    掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等). 数组高级以及Arrays(掌握) 排序方法 空间复杂度 时间复杂度 稳定性 插 入 排 序 ...

  7. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)...

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  8. 【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)...

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/20043459   前言 本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃 ...

  9. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

最新文章

  1. android menu点击事件6,Android Menu
  2. 31312312312iiiii
  3. tkinter 菜单添加事件_Tasker的最新测试劫持了Android 11的电源菜单
  4. curPos和tgtPos
  5. 代码写好了怎么在php里裕兴_8 行代码用Python画一个中国地图
  6. java out.flush_java中基本输入输出流的解释(flush方法的使用)
  7. Google AdWords广告的12个技巧
  8. Spring Cloud 一:注册中心
  9. 使用MbrFix.exe修复MBR分区表
  10. MFC为窗口创建线程,以及线程与窗口间的通信
  11. matlab中的高阶导数,如何用matlab求函数的导数与高阶导数 需要技巧
  12. Struts2.0中ActionInvocation使用
  13. 支持视频语音通话的免费远程管理软件-Rd远控
  14. (liunx)全套青龙面板+傻妞流水版2022年8月22日更新
  15. 安装GitExtentions KDiff3已配置为合并工具,kdiff3的路径未配置
  16. FDD LTE B1是什么
  17. 南澳大学计算机科学专业学费,澳洲南澳大学生活费
  18. php 用积分兑换_PHP积分兑换接口实例_PHP
  19. SQL Server AlwaysOn部署
  20. idea Failed to clean project Failed to delete target

热门文章

  1. c语言和python哪个自学好-自学编程应该从c语言还是python入手?
  2. python线下培训-Python培训线上和线下有什么区别?
  3. NameServer的总控逻辑
  4. UVa1422 - Processor(二分法)
  5. 网络编程学习笔记(IPv4套接口选项)
  6. jmeter(十八)关联之XPath Extractor
  7. Problem 2238 Daxia Wzc's problem 1627 瞬间移动
  8. memcached安装、使用
  9. Python 数据类型及其用法
  10. jquery实现tab切换加自动滚动切换