以下三种插入排序时间复杂度均为O(n^2)

简单插入排序,简单直接。假定数组有序,插入 i, 从后往前遍历找到适合位置 j,移动 j +1 ~ i -1往后一位,插入i到j中。

void insertSort(int *arr, int numsSize)
{int i, j, k, v;for (i = 1; i < numsSize; i++){for (j = i - 1; j >= 0; j--){if (arr[i] >= arr[j])break;}v = arr[i];for (k = i; k > j + 1; k--)arr[k] = arr[k-1];arr[k] = v;  }return;
}

折半插入排序,和简单插入排序相比减少比较次数,稍稍好那么一丢丢,时间复杂度还是O(n^2)

void BiInsertSort(int *arr, int numsSize)
{int high, low, m, i, j, v;for (i = 1; i < numsSize; i++){high = i - 1;low = 0;v = arr[i];while (low <= high){m = (low + high)/2;if (arr[m] >= arr[i])high = m - 1;elselow = m + 1;}for (j = i; j > low; j--){arr[j] = arr[j-1];}arr[low] = v;}
}

2路插入排序,减少移动次数,额外增加一个循环数组,需要考虑边界溢出,特别容易出错。时间复杂度和其它插入排序相比没有基本改变,不建议使用但是要理解并能够写出代码。first和final分别表示循环数组中的起始位置。

void insertSort2(int *array, int arraysize)
{int final, first, i, j, n;final = first = 0;if (!array || arraysize < 1)return ;int *tmp = (int *)malloc(sizeof(int) * arraysize);if (!tmp){printf("malloc error\n");return ;}tmp[0] = array[0];for (i = 1; i < arraysize; i++){if (array[i] >= tmp[0]){//插入到左边j = final;while(array[i] < tmp[j])j--;for (n = ++final; n > j + 1; n--)tmp[n] = tmp[n-1];tmp[n] = array[i]; }else{//插入到右边if (first == 0){first = arraysize - 1;tmp[first%arraysize] = array[i];}            else{j = first - arraysize;while(tmp[(j + arraysize)%arraysize] < array[i])j++;for (n = (--first - arraysize); n < (j - 1); n++)tmp[(n + arraysize)%arraysize] = tmp[(n + 1 + arraysize)%arraysize];tmp[(n + arraysize)% arraysize] = array[i]; }}}
}

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

简单插入排序,折半插入排序和2路插入排序 c源码相关推荐

  1. 小白前端之路:手写一个简单的vue-router这几年,好像过的好快,怀念我的大学生活。 - 连某人 大三实习生,之前写过简单MVVM框架、简单的vuex、但是看了vue-router的源码(看了

    这几年,好像过的好快,怀念我的大学生活. 连某人 大三实习生,之前写过简单MVVM框架.简单的vuex.但是看了vue-router的源码(看了大概)之后就没有写,趁着周末不用工作(大三趁着不开学出来 ...

  2. 【我的架构师之路】- golang源码分析之协程调度器底层实现( G、M、P)

    本人的源码是基于go 1.9.7 版本的哦! 紧接着之前写的 [我的区块链之路]- golang源码分析之select的底层实现 和 [我的区块链之路]- golang源码分析之channel的底层实 ...

  3. HTML期末大作业~简单的程序员个人博客网站模板源码(HTML+CSS)~个人主页博客web网页设计制作~HTML简单个人网页制作~Web大学生网页成品...

    HTML期末大作业~ 简单的程序员个人博客网站模板源码(HTML+CSS)~学生HTML个人网页作业作品下载 ~个人主页博客网页设计制作 ~大学生个人网站作业模板 ~简单个人网页制作 临近期末, 你还 ...

  4. 简单干净的Emlog6.0.1技术导航模板源码-视频教程

    简介: 简单干净的Emlog6.0.1技术导航模板源码:一款非常简洁的Emlog6.0.1技术导航的模板,有着无框架.精简.加载迅速著称,还有些许实用的功能,此模板是有史以来第一款Emlog完整版的技 ...

  5. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码

    HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...

  6. <漫漫Android路>AOSP源码获取编译及问题处理

    漫漫Android路---1.AOSP源码获取编译及导入 写在前面 环境准备 AOSP源码获取 1.Repo下载配置 2.Git安装及配置 3.AOSP获取 AOSP源码编译 1.安装编译依赖 2.开 ...

  7. 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码...

    HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...

  8. java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...

  9. C++结合插入排序和合并排序的算法(附完整源码)

    C++结合插入排序和合并排序的算法 C++结合插入排序和合并排序的算法完整源码(定义,实现,main函数测试) C++结合插入排序和合并排序的算法完整源码(定义,实现,main函数测试) #inclu ...

  10. APM飞控学习之路:4 源码裁剪与下载

    "月盈则亏,水满则溢".当博主编译完成,以为离成功更近一步准备下载的时候,殊不知陷阱也早已准备好,等待我的踏入.连上USB线,下载,timeout...,timeout...,ti ...

最新文章

  1. 【原】IOS文件操作
  2. Apache Pulsar中的地域复制,第1篇:概念和功能
  3. Xcode11 上传苹果卡在Authenticating with the iTunes store 或者transpoter上传卡在正在验证 APP - 正在通过App Store进行认证
  4. python asyncio文件操作_Python asyncio文档阅读摘要
  5. Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求
  6. BAD APPLE C++控制台程序
  7. CodeForces - 507E Breaking Good(二分+贪心)
  8. CF79D Password(P3943 星空)
  9. go get 的不再src目录中_如何正确的开始用Go编程
  10. invalid use of constructor as a template 编译错误
  11. CMOS和TTL电路区别
  12. html显示链接音乐,歌曲链接怎么填_HTML中如何链接本地音乐
  13. 5类6类7类网线对比_超详细的超五类、六类、七类网线的对比
  14. SpringMybaits数据库配置解惑
  15. 2020年新年新气象
  16. 气象大数据平台(天擎)数据读取方法(python)(地面资料下载)
  17. QNX-Adaptive Partition
  18. 查看/修改git用户名密码
  19. 自定义 C++ 和 CUDA 扩展
  20. 题目:输入一个8bit数,输出其中1的个数,只能使用1bit全加器

热门文章

  1. (转)xshell无法在vim中复制黏贴
  2. r语言提取列名_R语言基础(2)向量|矩阵|数组|数据框|数据IO|实用函数
  3. android aar 修改,Android aar包修改代码后重新打包
  4. 玩转Mixly – 6、Arduino AVR编程 之 文本
  5. STM32 基础系列教程 0 - CubeMX 下载与安装
  6. 进程(process)和线程(thread)
  7. android反编译的方法
  8. 无服务器计算的黑暗面:程序移植没那么容易
  9. 网站压力测试工具webbench简介、安装、使用
  10. flayber正文 再谈如何学习Linux,一线Linux专家学习经验谈