PHP数据结构(十八) ——直接插入排序
时间:2022-05-03
本文章向大家介绍PHP数据结构(十八) ——直接插入排序,主要内容包括PHP数据结构(十七) ——内部排序综述、PHP数据结构(十六) ——B树、PHP数据结构(十五) ——哈希表、PHP数据结构(十四) ——键树(双链树)、PHP数据结构(十三) ——动态查找表(二叉排序树)、PHP数据结构(十二) ——静态查找表、PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)、PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)、PHP数据结构(十) ——有向无环图与拓扑算法、PHP数据结构(九) ——图的定义、存储与两种方式遍历、PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)、PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践1)、PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论)、PHP数据结构(七) ——串与实现KMP算法、PHP数据结构(六) ——树与二叉树之概念及存储结构、PHP数据结构(六) ——数组的相乘、广义表、PHP数据结构(五) ——数组的压缩与转置、PHP数据结构(四) ——队列、PHP数据结构(三)——运用栈实现括号匹配、PHP数据结构(二)——链式结构线性表、PHP数据结构(一)——顺序结构线性表、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
PHP数据结构(十八)——直接插入排序
(原创内容,转载请注明来源,谢谢)
一、概述
插入排序分为直接插入排序、其他插入排序、希尔排序。其他插入排序又分为折半插入排序、2-路插入排序。
二、直接插入排序
直接插入排序是一种最简单的排序方法,时间复杂度O(n2),实现方式是将一个记录插入到已经排序好的有序表,得到一个新的、记录数增加1的有序表。
插入排序的核心思想,即假设原数组的第0位至第i-1位都是有序排列的(如从小到大),当第i位出现顺序错误(如第i位的值小于第i-1位),则需要进行插入排序。
1、算法
直接插入排序经过以下几步:
1)按照待排序数组的顺序,从第二个数字开始,逐个数字与前一个数字进行比较。
2)假设当前的比较是从小到大的排序,数组arr。当arr[i]>=arr[i-1]时,第i个元素保持原位,对i+1进行比较。
3)当arr[i]<arr[i-1]时,则需要进行插入排序。方法是将arr[i]拎出来,从i-1直至0位置的值,逐个进行比较,当比较到第k位,arr[k]<arr[i]时,将arr[k+1]至arr[i-1]的至分别往后挪一位,挪到arr[k+2]至arr[i]的位置,然后将原来的arr[i]的值插入至arr[k+1]处。再继续往后进行比较。
4)直至遍历完所有的节点,插入排序结束,所得的数组即排序好的数组。
5)当需要从大到小排序时,结果相似,不赘述。
2、关键代码实现如下
//直接插入排序
publicfunction directInsertSort(array $arr = array()){
//如果没有输入,则拿默认的值比较
if(empty($arr)){
$arr= $this->arr;
}
//如果数组为空或者只有一个元素,直接返回原数组
if(null== $arr || 1 >= count($arr)){
return$arr;
}
//0...i-1都是有序的,此时插入第i个值
for($i=1;$i<count($arr);$i++){
//当第i个小于第i-1个时,需要进行插入排序,否则循环下一个数
if($arr[$i]< $arr[$i-1]){
//把第i个值往前挪到x位置,保证arr[x-1]<=arr[i],arr[x+1]>arr[i]
$tmp= $arr[$i];
for($j=$i-1;$j>=0&&$arr[$j]>$tmp;$j--){
$arr[$j+1]= $arr[$j];//所有元素往后挪一位
}
//第j+1位赋值留给原来的第i位
$arr[$j+1]= $tmp;
}
}
return$arr;
}
注:此代码为实现直接插入排序的核心代码,代码的方法写在类中,待全部排序都写完后会有完整版的代码
——written by linhxx 2017.07.16
相关阅读:
PHP数据结构(十七) ——内部排序综述
PHP数据结构(十六) ——B树
PHP数据结构(十五) ——哈希表
PHP数据结构(十四) ——键树(双链树)
PHP数据结构(十三) ——动态查找表(二叉排序树)
PHP数据结构(十二) ——静态查找表
PHP数据结构(十一) ——图的连通性问题与最小生成树算法(2)
PHP数据结构(十一) ——图的连通性问题与最小生成树算法(1)
PHP数据结构(十) ——有向无环图与拓扑算法
PHP数据结构(九) ——图的定义、存储与两种方式遍历
PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践2)
PHP数据结构(八) ——赫夫曼树实现字符串编解码(实践1)
PHP数据结构(八) ——赫夫曼树实现字符串编解码(理论)
PHP数据结构(七) ——串与实现KMP算法
PHP数据结构(六) ——树与二叉树之概念及存储结构
PHP数据结构(六) ——数组的相乘、广义表
PHP数据结构(五) ——数组的压缩与转置
PHP数据结构(四) ——队列
PHP数据结构(三)——运用栈实现括号匹配
PHP数据结构(二)——链式结构线性表
PHP数据结构(一)——顺序结构线性表
- Webpack中hash与chunkhash的区别,以及js与css的hash指纹解耦方案
- RPC原理及实现
- RMI原理及实现
- webpack多页面开发与懒加载hash解决方案
- 前后端分离和模块化-58到家微信首页重构之路
- Node.js建站笔记-使用react和react-router取代Backbone
- 协同过滤推荐算法Java代码实现
- Nginx模块之Filter解析
- Nodejs建站笔记-注册登录流程的简单实现
- 前端工程化-构建
- [翻译]开发Silverlight 2.0的自定义控件
- LINQ to SQL 辅助工具
- Nginx模块之Upstream解析
- Nginx之如何编写Handler模块
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- IE11出现"__doPostBack”未定义
- latex()、ploy2sym()、symsum()的妙用
- 性能最佳实践:MongoDB数据建模和内存大小调整
- 节省你生命的一个小技术No.193
- K8S 生态周报| Traefik v2.3.0-rc2 发布
- 如何从 Notion 批量导出 Markdown?
- 【LeetCode】1518. 换酒问题
- OBS推流工具使用说明
- Python多进程
- app反编译遇到360加固,傻瓜式脱壳
- Java底层-本地接口(JNI)
- 如何从最坏、平均、最好的情况分析复杂度?
- 利用Python进行MR栅格数据处理
- 利用Sql处理MR栅格数据
- Netty组件之Channel注册