来源:转载 发布时间:2018-12-15 16:05:35 阅读量:865
php中对于数组的排序方法是有很多种的,每种数组排序也都有各自不同的原理,下面就来具体看一下关于快速排序算法,归并排序算法以及插入排序算法的示例。
求如下数组中数字的平均值:
1 2 3 4 5 6 7 8 |
|
原理描述:
对于这样一个数组:[5, 1,2, 6,7];
取出第一项(并作为中间数组),并将其余项与其对比后,分为两个数组:
左边数组项比中间项小,右边数组不比中间项小。
如果左边数组和右边数组已经是排好序的数组,则将这3者合并起来,就是最终结果。
如果左边数组和右边数组还不是排好序的数组,则继续递归使用本函数获取有序数组。
原理图:
原理性数据:
$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 |
|
原理描述:
对于这样一个数组:[2, 3, 4, 1];
要将某个数n插入到一个已经排好序的数组中,
只要将n跟这个数组的项从后往前一个一个对比,只要发现某项比n大,
就将该项后移一位,然后继续往前取出并对比,比n大就往后移动一位,以此类推。
最后没有比n大的时候,就把n放入到刚才往后移动时空出来的那个位置上。
对于一个数组,第1项就可以当做一个“已经排好序”的数组,
则第2项就可以遵照上述原理来进行“插入排序”,于是前两个就可以排好,
并成为了具有两个元素的“排好序的数组”。后续以此类推。
原理图:
原理数据:
$arr1 = [2, 3, 4, 1]; //有力说明原理的数据1
$arr1 = [2, 3, 1]; //有力说明原理的数据2
$arr1 = [2, 1]; //有力说明原理的数据3
$arr1 = [1, 2]; //有力说明原理的数据3
具体案例:
1 2 3 4 |
|
原理描述:
对于这样的一个数组: $arr1 = [1, 3, 5, 2, 4, 6];将其一分为二:$a = [1, 3, 5],
$b = [2, 4, 6];
如果有两个各自已经排好序的数组,则对这两个数组进行如下操作后,就可以获得一个排好序的这两个数组的“溶合数组”:
取出数组a的第一项a1,再取出数组b的第一项b1,比较a1和b1的大小,
并将小的(假设为a1)放入一个新数组,并去删除对应数组a的第一项,
而后再取出对应数组的第一项(不是刚才的那个数据了),而后继续将两者对比大小
每次都放入小的到新数组中,并继续下一次的“删除,取数,对比”。。。。
这样之后最终的结果是,新的数组中就可以得到一个新的排好序的数组。
对于尚未排好序的数组,只要对其以递归方式继续“一分为二”地分割,最终会得到最短数组——只有一个或0个单元,这种数组自然是排好序的了。
原理图:
原理数据:
$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 |
|