当前位置: 首页 > 编程日记 > 正文

排序算法之插入排序

插入排序一般分为直接插入排序二分插入排序
一、直接插入排序:直接插入排序又可以分为前插和后插,不过虽然是这样分,只是寻找地点的方向不一样而已。“前插”就是从头开始找合适的位置,“后插”就是从后面开始找合适的位置。直接插入排序的思想很简单,开始时,整个数组都是无序的,默认第一个数是排好序的,然后要把第二个数插入到前面,那么就要找到合适的位置插入,从当前数的前一个数$a与当前数$s进行比较,如果此时$a<$s,那么就把$s插入到$a的后面,否则$s就与$a前面的数$b进行比较,或者$a已经是第一个数了就停止,把$s插入到数组的第一个位置。现在前两个数已经是有序的了, 然后就是插入第三个数,步骤是一样的。一个关键性的问题就是,循环停止的位置是要插入的位置的前一个,也就是说,应该从这个位置的后一个向后移动,腾出那个合适的位置。腾位置时应该是前一个数覆盖后一个数,所有for循环应该从后向前开始。
   1、前插:
         插入流程:
      初始状态:  (17) ,3 ,25 ,14 ,20, 9
      第一次插入:(3 , 17),25 ,14 ,20, 9
      第二次插入:(3 , 17, 25),14 ,20, 9
      第三次插入:(3 , 14, 17, 25),20, 9
      第四次插入:(3 , 14, 17, 20 ,25),9
      第五次插入:(3 , 9 ,14, 17, 20 ,25)
       代码实现:
<?php/*** php 插入排序*/
$arr = array(17,3 ,25,14,20,9);function insertSort(&$arr) {//先默认第一个下标为0的数是排好的数for ($i = 1; $i < count($arr); $i++) {//确定插入比较的数$insertVal = $arr[$i];//确定与前面比较的数比较$insertIndex = $i - 1;//表示没有找到位置while ($insertIndex >= 0 && $insertVal < $arr[$insertIndex]) {//把数后移$arr[$insertIndex + 1] = $arr[$insertIndex];$insertIndex--;}//插入(给$insertval找到位置了)$arr[$insertIndex + 1] = $insertVal;}
}insertSort($arr);
print_r($arr);
?>

2、后插:

插入流程:
    初始状态:  17,3 ,25,14,20,(9)
    第一次插入:3 ,17,25,14,(9,20)
    第二次插入:3 ,17,25,(9,14,20)
    第三次插入:3 ,14,(9,17,20,25)
    第四次插入:3 ,(9,14,17,20,25)
    第五次插入:(3 ,9,14,17,20,25)

代码实现:

<?php/*** php 插入排序 */
$arr = array(17,3 ,25,14,20,9);function insertSort(&$arr) {$len = count($arr);//先默认第一个下标为len的数是排好的数 for ($i = $len - 2; $i >= 0; $i--) {//确定插入比较的数 $insertVal = $arr[$i];//确定与前面比较的数比较 $insertIndex = $i + 1;//表示没有找到位置 while ($insertIndex < $len && $insertVal > $arr[$insertIndex]) {//把数前移 $arr[$insertIndex - 1] = $arr[$insertIndex];$insertIndex++;}//插入(给$insertval找到位置了) $arr[$insertIndex - 1] = $insertVal;}
}insertSort($arr);
print_r($arr);
?> 

二、二分插入排序:二分插入排序只不过查找的方式不同而已。每次要插入的值$a[$i]总是与前面已排好序的中间的值$a[$mid]进行比较,如果$a[$i]比较小则在前面的区间继续二分查找,否则在后面的区间。

<?php/*** php 插入排序 */
$arr = array(12, 234, 33);function binarySort(&$a) {$len = count($a);for ($i = 1; $i < $len; $i++) {$left = 0;$right = $i;while ($left <= $right) {$mid = intval(($left + $right) / 2);if ($a[$mid] > $a[$i]) {$right = $mid - 1;} else if ($a[$mid] < $a[$i]) {$left = $mid + 1;} else {break;}}//保存当前数据$s = $a[$i];//将数据向后移动for ($k = $i; $k >= $left; $k--) {$a[$k] = $a[$k - 1];}//将当前的数据放在找到的位置$a[$left] = $s;}
}binarySort($arr);
print_r($arr);
?> 

转载于:https://www.cnblogs.com/solodance/p/3344629.html

相关文章:

C++中#error/assert/static_assert的区别及使用

C 语言支持可帮助您调试应用程序的三个错误处理机制&#xff1a;#error 指令、static_assert 关键字和 assert (CRT) 宏。所有的三种机制都会发出错误消息。#error可看做预编译期断言&#xff0c;甚至都算不上断言&#xff0c;仅仅能在预编译时显示一个错误信息&#xff0c;它能…

读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势

作者 | Michael Galkin译者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】近年来&#xff0c;自然语言处理领域中广泛应用的知识图谱&#xff08;KGs&#xff09;正在不断地吸引人们的目光&#xff0c;此次 ACL 2019 中的有关于知识图…

力扣(LeetCode)933

题目地址&#xff1a;https://leetcode-cn.com/probl...题目描述&#xff1a;写一个 RecentCounter 类来计算最近的请求。 它只有一个方法&#xff1a;ping(int t)&#xff0c;其中 t 代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的 ping 数。 任何处于 [t - 3000, …

2013年10月1日C#随机数

最近开始接触C跟C#&#xff0c;总是有人说女生本来就不适合做程序&#xff0c;就连今天都听到有人这样跟我讲&#xff0c;不过呢没有关系&#xff0c;我相信男生不一定比女生厉害多少&#xff0c;就好像我身边就有一位男生就总是觉得我的程序比他好一点就是理所当然的&#xff…

C/C++中inline/static inline/extern inline的区别及使用

引入内联函数的目的是为了解决程序中函数调用的效率问题&#xff0c;也是用内联函数取代带参宏定义&#xff08;函数传参比宏更加方便易用&#xff09;inline关键字用来定义一个类的内联函数。在类体中和类体外定义成员函数是有区别的&#xff1a;在类体中定义的成员函数为内联…

RISC-V架构上的Debian和Fedora现状

RISC-V仍然是开源/Linux用户非常感兴趣的&#xff0c;因为它是免版税且完全开放的CPU架构。部分原因是由于缺乏经济实惠的RISC-V硬件&#xff0c;限制了开发人员在这种架构上的更多工作&#xff0c;Linux发行版支持的RISC-V状态各不相同&#xff0c;但近年来至少有所改善。在上…

字节跳动李航:自学机器学习,研究AI三十载,他说AI发展或进入平缓期

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】一阵凉风吹过人工智能&#xff0c;让这个曾是燥热的领域逐渐冷却下来&#xff0c;留下的是扎实地在做研究的人、机构、企业。先后在 NEC 公司中央研究所、微软亚洲研究院、华为诺亚方舟实验室从事和…

PC上安装MAC X Lion

PC上安装MACXLion网上关于如何在PC下安装MAC的文章已近不少了&#xff0c;但对于一些初学者在实践当中会遇到各种问题&#xff0c;以下视频资料为大家展示两种虚拟机安装MacOS。1.VmwareWorkstation在虚拟机中安装首先将插件装好&#xff08;在远景上下载&#xff09;&#xff…

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C风格的强制转换较简单&#xff0c;如将float a转换为int b&#xff0c;则可以这样&#xff1a;b (int)a&#xff0c;或者bint(a)。 C类型转换分为隐式类型转换和显示类型转换。 隐式类型转换又称为标准转换&#xff0c;包括以下几种情况&#xff1a; (1)、算术转换&#x…

行为型模式:命令模式

LieBrother原文&#xff1a; 行为型模式&#xff1a;命令模式 十一大行为型模式之三&#xff1a;命令模式。 简介 姓名 &#xff1a;命令模式 英文名 &#xff1a;Command Pattern 价值观 &#xff1a;军令如山 个人介绍 &#xff1a; Encapsulate a request as an object,ther…

与旷视、商汤等上百家企业同台竞技?AI Top 30+案例评选等你来秀!

人工智能历经百年发展&#xff0c;如今迎来发展的黄金时期。目前&#xff0c;AI 技术已涵盖自然语言处理、模式识别、图像识别、数据挖掘、机器学习等领域的研究&#xff0c;在汽车、金融、教育、医疗、安防、零售、家居、文娱、工业等行业获得了令人印象深刻的成果。在各行业宣…

在CSS中定义a:link、a:visited、a:hover、a:active顺序

摘自&#xff1a;http://www.qianyunlai.com/post-2.html以前用CSS一直没有遇到过这个问题&#xff0c;在最近给一个本科同学做的项目里面。出现一些问题&#xff0c;搜索引擎查了一些网站和资料&#xff0c;发现很多人问到这个问题&#xff0c;给出的结果我试了试&#xff0c;…

C++中istream的使用

在项目中会经常用到读取一些配置数据&#xff0c;这些数据根据实际需要有可能会调整&#xff0c;如果将这些数据直接嵌入进代码中会非常不便&#xff0c;需要经常调整代码。将这些数据写入配置文件中然后在读入&#xff0c;如果需要调整&#xff0c;只需修改配置文件&#xff0…

手把手教你用Python模拟登录淘宝

作者 | 猪哥66来源 | 裸睡的猪&#xff08;ID:IT--Pig&#xff09;最近想爬取淘宝的一些商品&#xff0c;但是发现如果要使用搜索等一些功能时基本都需要登录&#xff0c;所以就想出一篇模拟登录淘宝的文章&#xff01;看了下网上有很多关于模拟登录淘宝&#xff0c;但是基本都…

Python之机器学习K-means算法实现

一、前言&#xff1a; 今天在宿舍弄了一个下午的代码&#xff0c;总算还好&#xff0c;把这个东西算是熟悉了&#xff0c;还不算是力竭&#xff0c;只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行&#xff0c;运行的Python环境是Python3.6以上的版本&#…

C++中模板的使用

模板(Template)指C程序设计语言中的函数模板与类模板&#xff0c;是一种参数化类型机制。模板是C泛型编程中不可缺少的一部分。C templates enable you to define a family of functions or classes that can operate on different types of information.模板就是实现代码重用机…

php面试问答

结合实际PHP面试&#xff0c;汇总自己遇到的问题&#xff0c;以及网上其他人遇到的问题&#xff0c;尝试提供简洁准确的答案包含MySQL、Redis、Web、安全、网络协议、PHP、服务器、业务设计、线上故障、个人简历、自我介绍、离职原因、职业规划、准备问题等部分 GitHub: https:…

图解LSTM与GRU单元的各个公式和区别

作者 | Che_Hongshu来源 | AI蜗牛车 &#xff08;ID: AI_For_Car)因为自己LSTM和GRU学的时间相隔很远&#xff0c;并且当时学的也有点小小的蒙圈&#xff0c;也因为最近一直在用lstm&#xff0c;gru等等&#xff0c;所以今天没事好好缕了一下&#xff0c;接下来跟着我一起区分并…

iphone越狱神器

前阵子刚刚换了iphone5&#xff0c;老婆的4就留给我了。一到手就决定越狱&#xff0c;无意中发现了一款越狱神器&#xff1a;爱思助手http://www.i4.cn/ 确实很好用转载于:https://blog.51cto.com/shanks/1306423

json11库的使用

JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式&#xff0c;易于让人阅读。同时也易于机器解析和生成。尽管JSON是Javascript的一个子集&#xff0c;但JSON是独立于语言的文本格式&#xff0c;并且采用了类似于C语言家族的一些习惯。JSON解析器和JSON库支持许…

覆盖10亿设备,月活2亿,快应用要取代App?

作者 | 伍杏玲 来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2017 年 1 月 9 日&#xff0c;微信小程序横空出世&#xff0c;紧接着支付宝小程序、百度智能小程序、今日头条小程序、12 大厂商联盟的快应用等布局小程序。自此&#xff0c;小程序迅速改变国内移…

跨域的四种方式

本文主要是关于跨域的几种方式&#xff0c;关于什么是跨域这里就不多说了&#xff0c;写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解&#xff0c;页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源&#xff0c;获取到了之后&#xff…

使用模式创建一个面向服务的组件中间件

引言 在本文中&#xff0c;您将了解面向服务的组件中间件在用于资源有限的语音设备时&#xff0c;在设计阶段所应用的模式。它涵盖了项目的问题上下文&#xff0c;并被看成是一组决定因素&#xff0c;是对相关体系结构远景的一个简要概括。您还会得到一份描述&#xff0c;其中介…

OpenCV代码提取:遍历指定目录下指定文件的实现

OpenCV 3.1之前的版本&#xff0c;在contrib目录下有提供遍历文件的函数&#xff0c;用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便&#xff0c;这里将OpenCV 2.4.9中相关的函数给提取了出来&#xff0c;适合在Windows 64bits上使用。directory.hpp…

姚班三兄弟3万块创业八年,旷视终冲刺港股

作者 | 余洋洋 杨健楷编辑 | 张丽娟来源 | CV智识&#xff08;ID:CVAI2019&#xff09;旷视此次 IPO 或将成为整个 AI 行业的信号&#xff0c;不只是“ 四小龙”的另外三家——商汤、依图、云从&#xff0c;整个 AI 行业的创业公司都将受到影响。8月25日晚&#xff0c;AI 独角兽…

Java类加载器详解

Java虚拟机中的类加载有三大步骤&#xff1a;&#xff0c;链接&#xff0c;初始化&#xff0e;其中加载是指查找字节流&#xff08;也就是由Java编译器生成的class文件&#xff09;并据此创建类的过程&#xff0c;这中间我们需要借助类加载器来查找字节流&#xff0e; Java虚拟…

linux svn客户端的使用

一下内容转载于&#xff1a;http://blog.chinaunix.net/space.php?uid22976768&doblog&id1640924。这个总结的很好~ windows下的TortoiseSVN是资源管理器的一个插件&#xff0c;以覆盖图标表示文件状态&#xff0c;几乎所以命令都有图形界面支持&#xff0c;比较好用&…

C++中vector的使用

向量std::vector是一种对象实体&#xff0c;能够容纳许多各种类型相同的元素&#xff0c;包括用户自定义的类&#xff0c;因此又被称为序列容器。与string相同&#xff0c;vector同属于STL(Standard Template Library)中的一种自定义的数据类型&#xff0c;可以广义上认为是数组…

说出来你可能不信,现在酒厂都在招算法工程师

导语&#xff1a;虽然夏日已过&#xff0c;但人们喝啤酒的热情还在持续高涨。不过随着大众的追求和理念提升&#xff0c;对于啤酒的要求也越来越高&#xff0c;比如逐渐兴起的精酿之风&#xff0c;都在印证人们在啤酒的口感和风味上&#xff0c;拥有更加「苛刻」的要求。那么这…

「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

前言 这是前端面试题系列的第 7 篇&#xff0c;你可能错过了前面的篇章&#xff0c;可以在这里找到&#xff1a; 理解函数的柯里化ES6 中箭头函数的用法this 的原理以及用法伪类与伪元素的区别及实战如何实现一个圣杯布局&#xff1f;今日头条 面试题和思路解析最近&#xff0c…