PHP实现数组排序的方法:快速排序,插入排序,归并排序算法

来源:转载 发布时间:2018-12-15 16:05:35 阅读量:865

php中对于数组的排序方法是有很多种的,每种数组排序也都有各自不同的原理,下面就来具体看一下关于快速排序算法,归并排序算法以及插入排序算法的示例。

异形数组的遍历

求如下数组中数字的平均值:

1

2

3

4

5

6

7

8

$arr1 = array(

1, 2, array(31, 32, 33), 4,

array(51, 52, 53, array(541, 542, 543, 544) ),

6, array(71, 72, 73),

);

$count = 0; //计数

$sum = GetArraySum($arr1);

echo “\

快速排序算法

原理描述:

对于这样一个数组:[5, 1,2, 6,7];

取出第一项(并作为中间数组),并将其余项与其对比后,分为两个数组:

左边数组项比中间项小,右边数组不比中间项小。

如果左边数组和右边数组已经是排好序的数组,则将这3者合并起来,就是最终结果。

如果左边数组和右边数组还不是排好序的数组,则继续递归使用本函数获取有序数组。

原理图:

QQ截图20180719140656.png

原理性数据:

$arr1 = [5, 2, 1, 6,7]; //有力说明原理的数据1

小的:[2, 1], 大的:[6, 7], 中间的: [5]

将三者合并: [1, 2, 5, 6, 7];

$arr1 = [2, 1]; //有力说明原理的数据2

中间:[2], 左边:[1] , []

具体案例:

1

2

3

4

$arr1 = [5, 2, 4, 6, 1, 3];

$arr1 = [5, 2, 4, 6, 1, 3];

//$arr1 = [5, 3, 2, 8, 7];

echo “\

插入排序算法

原理描述:

对于这样一个数组:[2, 3, 4, 1];

要将某个数n插入到一个已经排好序的数组中,

只要将n跟这个数组的项从后往前一个一个对比,只要发现某项比n大,

就将该项后移一位,然后继续往前取出并对比,比n大就往后移动一位,以此类推。

最后没有比n大的时候,就把n放入到刚才往后移动时空出来的那个位置上。

对于一个数组,第1项就可以当做一个“已经排好序”的数组,

则第2项就可以遵照上述原理来进行“插入排序”,于是前两个就可以排好,

并成为了具有两个元素的“排好序的数组”。后续以此类推。

原理图:

QQ截图20180719140722.png

原理数据:

$arr1 = [2, 3, 4, 1]; //有力说明原理的数据1

$arr1 = [2, 3, 1]; //有力说明原理的数据2

$arr1 = [2, 1]; //有力说明原理的数据3

$arr1 = [1, 2]; //有力说明原理的数据3

具体案例:

1

2

3

4

$arr1 = [5, 2, 4, 6, 1, 3];

$arr1 = [2, 3, 4, 1];

$arr1 = [2, 4, 5, 6, 1, 3];

echo “\

归并排序算法

原理描述:

对于这样的一个数组: $arr1 = [1, 3, 5, 2, 4, 6];将其一分为二:$a = [1, 3, 5], 
$b = [2, 4, 6];

如果有两个各自已经排好序的数组,则对这两个数组进行如下操作后,就可以获得一个排好序的这两个数组的“溶合数组”:

取出数组a的第一项a1,再取出数组b的第一项b1,比较a1和b1的大小,

并将小的(假设为a1)放入一个新数组,并去删除对应数组a的第一项,

而后再取出对应数组的第一项(不是刚才的那个数据了),而后继续将两者对比大小

每次都放入小的到新数组中,并继续下一次的“删除,取数,对比”。。。。

这样之后最终的结果是,新的数组中就可以得到一个新的排好序的数组。

对于尚未排好序的数组,只要对其以递归方式继续“一分为二”地分割,最终会得到最短数组——只有一个或0个单元,这种数组自然是排好序的了。

原理图:

QQ截图20180719140740.png

原理数据:

$arr1 = [1, 3, 5, 4, 6, 7, 8 ]; //有力说明原理的数据1

从中间一份为2: [ ]; [ 6, 7, 8]

[ 1, 3, 4, 5, ]

$arr1 = [1, 3, 2, 4]; //有力说明原理的数据2

演示案例:


1

2

$arr1 = [5, 2, 4, 6, 1, 3];

echo “\


标签: PHP
分享:
评论:
你还没有登录,请先