赞
踩
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。
a、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
b、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
c、针对所有的元素重复以上的步骤,除了最后一个。
d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
3、代码:
- /**
- * 冒泡排序
- * @param $arr
- * @return mixed
- */
- function arrayBubblingSort($arr) {
- $count = count($arr);
- //外层控制排序轮次
- for ($i = 0; $i < $count - 1; $i ++) {
- //内层控制每轮比较次数
- for ($j = 0; $j < $count - 1 - $i; $j ++) {
- if ($arr[$j] > $arr[$j + 1]) {
- $temp = $arr[$j];
- $arr[$j] = $arr[$j + 1];
- $arr[$j + 1] = $temp;
- }
- }
- }
- return $arr;
- }

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
a、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
b、设定两个指针,最初位置分别为两个已经排序序列的起始位置
c、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤c直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
- /**
- * 归并排序
- * @param array $array
- * @return array
- */
- function allMergeSort($array = []) {
- $count = count($array);
- //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
- if ($count <= 1) {
- return $array;
- }
- $mid = intval($count / 2);
-
- //拆分数组0-mid这部分给左边left_array
- $left_array = array_slice($array, 0, $mid);
-
- //拆分数组mid-末尾这部分给右边right_array
- $right_array = array_slice($array, $mid);
-
- //左边拆分完后开始递归合并往上走
- $left_array = allMergeSort($left_array);
-
- //右边拆分完毕开始递归往上走
- $right_array = allMergeSort($right_array);
-
- //合并两个数组,继续递归
- $return_array = mergeSort($left_array, $right_array);
- return $return_array;
- }
-
- /**
- * @param $left_array
- * @param $right_array
- * @return array
- */
- function mergeSort($left_array, $right_array) {
- $return_array = [];
- while (count($left_array) && count($right_array)) {
-
- $return_array[] = $left_array[0] < $right_array[0] ? array_shift($left_array) : array_shift($right_array);
- }
- return array_merge($return_array, $left_array, $right_array);
- }

设要排序的数组是A[0]……A[N-1],⾸先任意选取⼀个数据(通常选⽤数组的第⼀个数)作为关键数据,然后将所有⽐它⼩的数都放到它左边,所有⽐它⼤的数都放到它右边,这个过程称为⼀趟快速排序。值得注意的是,快速排序不是⼀种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产⽣变动
a、在数组中选⼀个基准数(通常为数组第⼀个);
b、将数组中⼩于基准数的数据移到基准数左边,⼤于基准数的移到右边;
c、对于基准数左、右两边的数组,不断重复以上两个过程,直到每个⼦集只有⼀个元素,即为全部有序。
- /**
- * 数组快速排序
- * @param $array
- * @return bool|array
- */
- function arrayQuickSort($array) {
- if (!is_array($array))
- return false;
- if (count($array) > 1) {
- $left = $right = [];
- for ($i = 1; $i < count($array); $i ++) {
- if ($array[$i] <= $array[0]) {
- $left[] = $array[$i];
- } else {
- $right[] = $array[$i];
- }
- }
- $left = arrayQuickSort($left);
- $right = arrayQuickSort($right);
- return array_merge($left, [$array[0]], $right);
- } else {
- return $array;
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。