算法之-归并排序算法,插入排序算法「建议收藏」

算法之-归并排序算法,插入排序算法

大家好,又见面了,我是全栈君。

一、归并排序法

归并排序是效率还是比較高的算法。当中的分治法是经常使用的一种解决这个问题的方法,如今流行的云计算事实上就是一种分治法的应用。

所谓的分治法,字面解释就是“分而治之”,就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,直到最后子问题能够简单的直接求解。原问题的解即子问题的解的合并。这个思想在实际工作中的作用很大,特别是处理大数据和做复杂运算的时候。

归并排序的基础是归并操作merge,即将两个有序数组合并为一个有序数组。

归并排序的算法思路为:
第一次扫描数组,将数组中相邻的两个元素merge为有序数组
第二次扫描,将相邻的有序数组再合并为更大的一个有序数组
再进行n次扫描,不断合并数组,直到排序完毕

算法之-归并排序算法,插入排序算法「建议收藏」

当中的归并操作merge的思路是:
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比較两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
反复步骤3直到某一指针达到序列尾
将还有一序列剩下的全部元素直接拷贝到合并序列尾

好了我们依照上面的思路来用PHP实现归并排序算法:

<?php//归并排序算法//首先定义归并操作merge函数function merge($arr1,$arr2){   $arr3=array();   while(!empty($arr1) && !empty($arr2)){       $arr3[]=$arr1[0]<=$arr2[0]?

array_shift($arr1):array_shift($arr2); } $arr3=array_merge($arr3,$arr1,$arr2); return $arr3;}//归并排序function merge_sort($newarray){ if(count($newarray)<=1) return $newarray; $middle=intval(count($newarray)/2); $arr1=array_slice($newarray, 0,$middle); $arr2=array_slice($newarray, $middle); return merge(merge_sort($arr1), merge_sort($arr2)); }$arr = array(9,8,7,6,5,8,7);print_r( merge_sort($arr));

越来越发现递归算法的重要性,熟练应用递归能够解决非常多实际的问题。

关于递归的理论能够參考http://www.cnsecer.com/4146.html

二、插入排序法

       插入排序(Insertion Sort)的算法描写叙述是一种简单直观的排序算法。它的工作原理是通过构建有序序列。对于未排序数据。在已排序序列中从后向前扫描,找到对应位置并插入。

插入排序在实现上。通常採用in-place排序(即仅仅需用到O(1)的额外空间的排序)。因而在从后向前扫描过程中,须要重复把已排序元素逐步向后挪位,为最新元素提供插入空间。

一般来说,插入排序都採用in-place在数组上实现。详细算法描写叙述例如以下:

  1. 从第一个元素開始,该元素能够觉得已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 假设该元素(已排序)大于新元素,将该元素移到下一位置
  4. 反复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 反复步骤2~5

假设比較操作的代价比交换操作大的话,能够採用二分查找法来降低比較操作的数目。

该算法能够觉得是插入排序的一个变种,称为function insert_sort($arr) { //区分 哪部分是已经排序好的 //哪部分是没有排序的 //找到当中一个须要排序的元素 //这个元素 就是从第二个元素開始,到最后一个元素都是这个须要排序的元素 //利用循环就能够标志出来 //i循环控制 每次须要插入的元素。一旦须要插入的元素控制好了, //间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列 for($i=1, $len=count($arr); $i<$len; $i++) { //获得当前须要比較的元素值。 $tmp = $arr[$i]; //内层循环控制 比較 并 插入 for($j=$i-1;$j>=0;$j--) { //$arr[$i];//须要插入的元素; $arr[$j];//须要比較的元素 if($tmp < $arr[$j]) { //发现插入的元素要小,交换位置 //将后边的元素与前面的元素互换 $arr[$j+1] = $arr[$j]; //将前面的数设置为 当前须要交换的数 $arr[$j] = $tmp; } else { //假设碰到不须要移动的元素 //因为是已经排序好是数组。则前面的就不须要再次比較了。

break; } } } //将这个元素 插入到已经排序好的序列内。 //返回 return $arr;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115508.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 怎么卸载nodejs(nodejs mongodb)

    Node.js是一个JavaScript运行环境,可以使JavaScript这类脚本语言编写出来的代码运行速度获得极大提升,那么安装后该如何卸载呢?Windows平台下卸载nodejs对于Windows平台来说,所有的应用程序的卸载方法都是一样的。1、在【卸载程序】中卸载程序和功能在桌面左下角单击【开始】按钮,然后选择【控制面板】,在控制面板窗口中找到【卸载程序】,单击打开。打开后可以看到所有已经安装的程序,找到node.js,然后单击右键选择【卸载】等待一会后系统就会提示卸..

    2022年4月18日
    259
  • PCA算法过程_pca推导

    PCA算法过程_pca推导PCA是主成分分析(PrincipalComponentsAnalysis)的简称。这是一种数据降维技术,用于数据预处理。一般我们获取的原始数据维度都很高,那么我们可以运用PCA算法降低特征维度。这样不仅可以去除无用的噪声,还能减少很大的计算量。…

    2025年5月26日
    0
  • CreatePipe、CreateProcess函数

    CreatePipe、CreateProcess函数0x01.CreatePipe函数管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(AnonymousPipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。先详细介绍一下管道,这里以匿名管道为

    2022年7月26日
    14
  • linux zip文件解压命令详解[通俗易懂]

    linux zip文件解压命令详解[通俗易懂]1、把/home目录下面的mydata目录压缩为mydata.zipzip-rmydata.zipmydata#压缩mydata目录2、把/home目录下面的mydata.zip解压到mydatabak目录里面unzipmydata.zip-dmydatabak3、把/home目录下面的abc文件夹和123.txt压缩成为abc123.zipzip-rabc12

    2022年6月7日
    42
  • 弹出USB大容量存储设备时出问题_win10无usb大容量存储

    弹出USB大容量存储设备时出问题_win10无usb大容量存储1、打开计算机管理2、点击事件查看器->自定义视图->管理事件3、双击管理事件里面的警告事件,打开它,4、点击详细信息5、记住上面的进程ID,然后打开任务管理器,找到刚才的那个进程,鼠标右键后点击结束进程树。…

    2022年10月7日
    0
  • shell循环做数字递增

    shell循环做数字递增在shell用for循环做数字递增的时候发现问题,特列出shell下for循环的几种方法:1.foriin`seq11000000`;doecho$idone用seq110000000做递增,之前用这种方法的时候没遇到问题,因为之前的i根本就没用到百万(1000000),因为项目需要我这个数字远大于百万,发现用seq…

    2022年7月24日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号