博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法之-归并排序算法,插入排序算法
阅读量:6504 次
发布时间:2019-06-24

本文共 2112 字,大约阅读时间需要 7 分钟。

一、归并排序法

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

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

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

归并排序的算法思路为:

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

当中的归并操作merge的思路是:

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

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

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; }

转载地址:http://tlmyo.baihongyu.com/

你可能感兴趣的文章
下面简要介绍软件工程的七条原理
查看>>
Lua(三)——语句
查看>>
怎么看电脑有没有安装USB3.0驱动
查看>>
overflow清除浮动的原理
查看>>
Spring Boot 使用parent方式引用时 获取值属性方式默认@
查看>>
解决maven下载jar慢的问题(如何更换Maven下载源)
查看>>
linux安装gitLab
查看>>
concurrent包的实现示意图
查看>>
golang os.Args
查看>>
Linux常用命令
查看>>
spring-data-elasticsearch 概述及入门(二)
查看>>
Solr启动和结束命令
查看>>
1.12 xshell密钥认证
查看>>
3.2 用户组管理
查看>>
ibatis 动态查询
查看>>
汇编语言之实验一
查看>>
git 调用 Beyond Compare
查看>>
SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]
查看>>
android实现图片识别的几种方法
查看>>
mvc学习地址
查看>>