简单插入排序,折半插入排序和2路插入排序 c源码
以下三种插入排序时间复杂度均为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源码相关推荐
- 小白前端之路:手写一个简单的vue-router这几年,好像过的好快,怀念我的大学生活。 - 连某人 大三实习生,之前写过简单MVVM框架、简单的vuex、但是看了vue-router的源码(看了
这几年,好像过的好快,怀念我的大学生活. 连某人 大三实习生,之前写过简单MVVM框架.简单的vuex.但是看了vue-router的源码(看了大概)之后就没有写,趁着周末不用工作(大三趁着不开学出来 ...
- 【我的架构师之路】- golang源码分析之协程调度器底层实现( G、M、P)
本人的源码是基于go 1.9.7 版本的哦! 紧接着之前写的 [我的区块链之路]- golang源码分析之select的底层实现 和 [我的区块链之路]- golang源码分析之channel的底层实 ...
- HTML期末大作业~简单的程序员个人博客网站模板源码(HTML+CSS)~个人主页博客web网页设计制作~HTML简单个人网页制作~Web大学生网页成品...
HTML期末大作业~ 简单的程序员个人博客网站模板源码(HTML+CSS)~学生HTML个人网页作业作品下载 ~个人主页博客网页设计制作 ~大学生个人网站作业模板 ~简单个人网页制作 临近期末, 你还 ...
- 简单干净的Emlog6.0.1技术导航模板源码-视频教程
简介: 简单干净的Emlog6.0.1技术导航模板源码:一款非常简洁的Emlog6.0.1技术导航的模板,有着无框架.精简.加载迅速著称,还有些许实用的功能,此模板是有史以来第一款Emlog完整版的技 ...
- 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码
HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...
- <漫漫Android路>AOSP源码获取编译及问题处理
漫漫Android路---1.AOSP源码获取编译及导入 写在前面 环境准备 AOSP源码获取 1.Repo下载配置 2.Git安装及配置 3.AOSP获取 AOSP源码编译 1.安装编译依赖 2.开 ...
- 个人HTML期末大作业~ 个人网页(HTML+CSS)6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码...
HTML期末大作业~ 个人网页6页面带下拉特效~简单带表格带设计说明 ~学生网页设计作业源码 作品介绍 下面介绍一下我的个人小网站吧,我的网站背景稍微单调一点白色,主要个人比较喜欢白色了,布局上面使用 ...
- java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...
- C++结合插入排序和合并排序的算法(附完整源码)
C++结合插入排序和合并排序的算法 C++结合插入排序和合并排序的算法完整源码(定义,实现,main函数测试) C++结合插入排序和合并排序的算法完整源码(定义,实现,main函数测试) #inclu ...
- APM飞控学习之路:4 源码裁剪与下载
"月盈则亏,水满则溢".当博主编译完成,以为离成功更近一步准备下载的时候,殊不知陷阱也早已准备好,等待我的踏入.连上USB线,下载,timeout...,timeout...,ti ...
最新文章
- 【原】IOS文件操作
- Apache Pulsar中的地域复制,第1篇:概念和功能
- Xcode11 上传苹果卡在Authenticating with the iTunes store 或者transpoter上传卡在正在验证 APP - 正在通过App Store进行认证
- python asyncio文件操作_Python asyncio文档阅读摘要
- Spring Cloud【Finchley】-07Feign构造多参数GET/POST请求
- BAD APPLE C++控制台程序
- CodeForces - 507E Breaking Good(二分+贪心)
- CF79D Password(P3943 星空)
- go get 的不再src目录中_如何正确的开始用Go编程
- invalid use of constructor as a template 编译错误
- CMOS和TTL电路区别
- html显示链接音乐,歌曲链接怎么填_HTML中如何链接本地音乐
- 5类6类7类网线对比_超详细的超五类、六类、七类网线的对比
- SpringMybaits数据库配置解惑
- 2020年新年新气象
- 气象大数据平台(天擎)数据读取方法(python)(地面资料下载)
- QNX-Adaptive Partition
- 查看/修改git用户名密码
- 自定义 C++ 和 CUDA 扩展
- 题目:输入一个8bit数,输出其中1的个数,只能使用1bit全加器
热门文章
- (转)xshell无法在vim中复制黏贴
- r语言提取列名_R语言基础(2)向量|矩阵|数组|数据框|数据IO|实用函数
- android aar 修改,Android aar包修改代码后重新打包
- 玩转Mixly – 6、Arduino AVR编程 之 文本
- STM32 基础系列教程 0 - CubeMX 下载与安装
- 进程(process)和线程(thread)
- android反编译的方法
- 无服务器计算的黑暗面:程序移植没那么容易
- 网站压力测试工具webbench简介、安装、使用
- flayber正文 再谈如何学习Linux,一线Linux专家学习经验谈