大家好,又见面了,我是全栈君。
一、归并排序法
归并排序是效率还是比較高的算法。当中的分治法是经常使用的一种解决这个问题的方法,如今流行的云计算事实上就是一种分治法的应用。
所谓的分治法,字面解释就是“分而治之”,就是把一个复杂的问题分成两个或很多其它的同样或相似的子问题,直到最后子问题能够简单的直接求解。原问题的解即子问题的解的合并。这个思想在实际工作中的作用很大,特别是处理大数据和做复杂运算的时候。
归并排序的基础是归并操作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在数组上实现。详细算法描写叙述例如以下:
- 从第一个元素開始,该元素能够觉得已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 假设该元素(已排序)大于新元素,将该元素移到下一位置
- 反复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 反复步骤2~5
假设比較操作的代价比交换操作大的话,能够採用二分查找法来降低比較操作的数目。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/115508.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...