看指针型的归并算法好麻烦,自己动手写一个,供自己学习用。
<?php
/**
* php 归并排序算法示例。这是无指针型的,代码容易看懂。
* 实际生产应用中,用指针速度更快。
*
* 输出如下:
*
*
start : 0 end: 1 临时数组:array ( 0 => 30, 1 => 66, )
start : 2 end: 3 临时数组:array ( 0 => 6, 1 => 45, )
start : 0 end: 3 临时数组:array ( 0 => 6, 1 => 30, 2 => 45, 3 => 66, )
最终结果:array ( 0 => 6, 1 => 30, 2 => 45, 3 => 66, )
*
*
* @author xieye
*/
$arr = [30, 66, 45,6,]; // 原始数组
$sort_arr = merge_sort( $arr ); // 排序
echo "最终结果:".var_export( $sort_arr, 1 ) ; //打印结果
// 归并算法总函数
function merge_sort ( array $arr )
{
return msort( $arr, 0, count( $arr ) - 1 );
}
// 递归分治,归并,此算法本身的思想是非常巧妙的。
function msort ( array $arr, $start, $end )
{
// 当子序列长度为1时,$start == $end,不用再分组,直接返回。
if ($start < $end) {
$mid = floor( ( $start + $end ) / 2 ); // 将 $arr 平分为 $arr[$start - $mid] 和 $arr[$mid+1 - $end]
$arr = msort( $arr, $start, $mid ); // 分治,将 $arr[$start - $mid] 归并为有序的$arr[$start - $mid]
$arr = msort( $arr, $mid + 1, $end ); // 分治,将 $arr[$mid+1 - $end] 归并为有序的 $arr[$mid+1 - $end]
$temparr = merge( $arr, $start, $mid, $end ); // 归并,将$arr[$start - $mid]部分和$arr[$mid+1 -end]部分合并起来成为有序的$arr[$start - $end]
echo "start : {$start} end: {$end} "." 临时数组:". var_export( $temparr, 1 )."<br>";
foreach ($temparr as $v) { // 将临时数组的值,也就是排序结果,替换掉原数组的对应位置。
$arr[$start ++] = $v;
}
}
return $arr;
}
// 单独的归并算法,不含分治。
// 前提是 start到mid部分是有序的,mid到end部分是有序的。所以合并的结果也是有序的。
// 归并算法的唯一缺点是,需要一块跟原数组一样大的内存空间。
function merge ( array $arr, $start, $mid, $end )
{
$temparr = [];
// 根据 下标 截取成两个数组。
$arr_left = array_slice( $arr, $start, $mid - $start + 1 );
$arr_right = array_slice( $arr, $mid + 1, $end - $mid );
while ($arr_left || $arr_right) { // 只要left数组和right数组任何一个不空,请不停继续下去。
if ($arr_left && $arr_right) { // 如果两个数组都有值,则取头部的最小值放到临时数组,并删除这个值在原数组中。
if ($arr_left[0] < $arr_right[0]) {
$temparr[] = array_shift( $arr_left ); // 弹出第一个并保存
} else {
$temparr[] = array_shift( $arr_right ); // 弹出第一个并保存,包括相等的情况。
}
} elseif (! $arr_left) { // 剩余两个else的存在意义:两个数组总有一方先取完,那就不需要比较了,于是取剩余的放到临时数组里。
$temparr[] = array_shift( $arr_right );
} else {
$temparr[] = array_shift( $arr_left );
}
}
return $temparr;
}
分享到:
相关推荐
以下是PHP中归并排序的代码示例: ```php function mergeSort($arr) { if (count($arr) ) { return $arr; } $mid = count($arr) / 2; $left = array_slice($arr, 0, $mid); $right = array_slice($arr, $mid...
下面是一个使用递归实现的PHP归并排序示例: ```php function mergeSort(&$arr, $left, $right) { if ($left $right) { $middle = floor(($left + $right) / 2); mergeSort($arr, $left, $middle); mergeSort($...
在实际应用中,更高效的排序算法如快速排序、归并排序或堆排序等会更为常见。然而,冒泡排序在教学和理解排序算法的基本概念上具有重要意义。 总结一下,这份"php-使用php开发的排序算法之BubbleSort-排序算法实现....
归并排序是一种高效的、稳定的排序算法,适用于处理大量数据。它的基本思想是将大问题分解为小问题,然后通过合并已排序的小问题来解决整个大问题。 归并排序的主要步骤包括: 1. 分解:将原始数组分解为两个或更多...
同样,其他如Java、Go、Python和PHP也有类似的库和示例代码,可以帮助开发者根据实际需求选择最适合的排序算法。记住,选择哪种排序算法取决于数据的特性和性能需求,比如数据量大小、是否稳定、空间复杂度等。
在实际开发中,我们通常会选择更高效的排序算法,如快速排序、归并排序或堆排序等。 了解并掌握冒泡排序算法有助于理解其他更复杂的排序算法,同时也能提升编程能力。在PHP开发中,虽然有内置的`sort()`和`asort()`...
在实际开发中,我们可能还需要了解更复杂的排序算法,比如快速排序、归并排序等。虽然PHP已经内置了高效的排序实现,但理解这些算法可以帮助我们更好地优化代码,尤其是在处理大数据量时。 总结来说,"sort.php" ...
冒泡排序算法是计算机科学中最经典且基础的排序算法之一,尤其在学习编程和算法的过程中,它作为入门级别的算法常常被用作教学示例。由于您提供的文章标题和描述中明确指出了“php 冒泡排序算法”,本文将对php语言...
未来,在面对更加复杂的排序需求时,开发者还可以结合其他排序算法(如归并排序、堆排序等)来进一步优化排序性能。 此外,本文还简单探讨了数据库排序的实现原理,并澄清了一些常见的误解,帮助读者更好地理解...
综上所述,这个压缩包包含的文件“php_leetcode题解之插入排序”很可能是一个PHP实现的插入排序算法示例,用于解答LeetCode上的相关问题。通过学习和实践这个例子,开发者可以深化对插入排序算法的理解,并掌握如何...
以下提供了五种不同编程语言(JavaScript、Python、Go、Java 和 PHP)中的冒泡排序算法实现示例。 ##### JavaScript 实现 ```javascript function bubbleSort(arr) { var len = arr.length; for (var i = 0; i ; ...
1. **排序算法**:冒泡排序属于比较基础的排序算法,除此之外还有选择排序、插入排序、希尔排序、快速排序、归并排序、堆排序等。 2. **PHP编程**:PHP是一种广泛用于Web开发的服务器端脚本语言,可以处理各种数据...
冒泡排序是一种简单的排序算法,它的基本思想是通过重复遍历待排序的...在实际编程中,更高效的排序算法如快速排序、归并排序等通常会被优先选择。然而,了解冒泡排序可以帮助我们更好地理解排序过程和基础算法原理。
在软件设计模式中,"简单工厂...在给定的压缩包文件中,可能包含了一些示例代码或者测试用例,用于展示这两种模式在实现排序算法中的应用。通过阅读和理解这些代码,开发者可以更好地掌握这两种设计模式的实际运用。
- 《php排序算法总结》:提供PHP中不同排序算法的实现,如冒泡排序、选择排序、插入排序、归并排序和快速排序等。 - 《PHP数据结构与算法教程》:涵盖数据结构和算法的基础知识,有助于提升编程技能。 - 《php程序...
冒泡排序是一种基础的排序算法,它的工作原理是通过重复遍历要排序的数列,比较并交换相邻的元素,对未排序序列做两两...对于需要处理大量数据的场景,更推荐使用时间复杂度更低的排序算法,例如快速排序、归并排序等。
掌握冒泡排序算法,能够帮助我们理解其他更为复杂的排序算法,如快速排序、归并排序等,这些算法都是在冒泡排序的基础上做了优化以提高效率。对于初学者来说,理解和实现冒泡排序是掌握更高级排序算法的重要基石。
此外,还可以结合其他高级排序算法,如插入排序、快速排序、归并排序和堆排序等,这些算法在特定情况下能提供更好的性能。在PHP中,可以通过自定义函数实现这些高级排序算法,以满足特定的排序需求。 总之,数组...
如果需要对大型数据集进行排序,通常会选择更为高效的排序算法,比如快速排序、归并排序或堆排序。 总而言之,通过PHP实现数组的插入排序可以帮助我们更深入地理解排序算法的工作原理,也可以为解决实际编程问题...