博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP数组排序算法实现(14种)
阅读量:7098 次
发布时间:2019-06-28

本文共 2915 字,大约阅读时间需要 9 分钟。

本文将介绍快速排序、计数排序、梳排序、堆排序、归并排序、希尔排序、选择排序、插入排序、地精排序、联合冒泡排序、鸡尾酒排序、冒泡排序、奇偶排序、使用标志的冒泡排序14种排序算法的实现。本文是由于阅读了文章《测试评估:14种排序算法和PHP数组》,才有想法学习、实现并总结这些算法,特此分享,陆续补充。

快速排序

1、思想:主要采用了递归和分治的思想。选择标尺后,进行遍历数组,将大于标尺的放到一个数组,将小于标尺的放置到一个数组。再递归调用本函数并记录结果。

2、实现

function quickSort($arr) {        //先判断是否需要继续进行        $length = count($arr);        if($length <= 1) {return $arr;}        //选择一个标尺,通常选择第一个元素        $base_num = $arr[0];        //初始化        $left = array();//小于标尺的        $right = array();//大于标尺的        for($i=1;$i<$length;$i++) {            if($base_num > $arr[$i]) {                $left[] = $arr[$i];            }else {                $right[] = $arr[$i];            }        }        //递归调用并记录        $left = $this->quickSort($left);        $right = $this->quickSort($right);        //合并        return array_merge($left,array($base_num), $right);

3、输入$arr = array(12, 100, 3, 20, 11,50);

4、输出

array:6 [▼  0 => 3  1 => 11  2 => 12  3 => 20  4 => 50  5 => 100]

计数排序

1、此算法,是一种稳定的线性时间排序算法。其基本思想是,用待排序的数作为计数数组的下标,统计每个数字的个数。然后依次输出即可得到有序序列。但是理解比较难,本人还没理解通透,但是总结了几个步骤:

  • 找出数组$arr中最大的数$max

  • 初始化用来计数的数组$count_arr,数组大小为$max

  • 对于计数数组$count_arr键值等于$arr[$i]的值加1

  • 计数数组$count_arr相邻的两个值相加

  • 键值翻转得到数组$over_turn

  • loop$over_turn,按照顺序push到最终的数组$result

2、实现

function countingSort($arr) {        $length = count($arr);        if($length <= 1) return $arr;        $size = count($arr);        $max = $arr[0];        //找出数组中最大的数        for($i=1;$i<$size;$i++) {            if($max < $arr[$i]) $max = $arr[$i];        }        //初始化用来计数的数组        for ($i=0;$i<=$max;$i++) {            $count_arr[$i] = 0;        }        //对计数数组中键值等于$arr[$i]的加1        for($i=0;$i<$size;$i++) {            $count_arr[$arr[$i]]++;        }        //相邻的两个值相加        for($i=1;$i<=$max;$i++) {            $count_arr[$i] = $count_arr[$i-1] + $count_arr[$i];        }        //键与值翻转        for ($i=$size-1;$i>=0;$i--) {            $over_turn[$count_arr[$arr[$i]]] = $arr[$i];            $count_arr[$arr[$i]]--; // 前一个数找到位置后,那么和它值相同的数位置往前一步        }        //按照顺序排列        $result = array();        for ($i=1;$i<=$size;$i++) {            array_push($result,$over_turn[$i]);        }        return $result;    }

3、输入$arr = array(8,6,1,3,4)

4、输出

array:5 [▼  0 => 1  1 => 3  2 => 4  3 => 6  4 => 8]

梳排序

1、思想:梳排序同样基于冒泡排序,梳排序比较的是固定距离处的数的比较和交换,类似希尔那样。是一种不稳定的排序算法。

2、实现

function combSort($arr) {    $length = count($arr);    $step = (int)floor($length/1.3);    while($step >= 1) {        for($i=0;$i<$length;$i++) {            if($i+$step<$length && $arr[$i]>$arr[$i+$step]) {                $temp = $arr[$i];                $arr[$i] = $arr[$i+$step];                $arr[$i+$step] = $temp;            }            if($i+$step>$length) {                break;            }        }        $step = (int)floor($step/1.3);    }        return $arr;    }

3、输入$arr = array(8,4,3,7,6,5,2,1)

4、输出

array:8 [▼  0 => 1  1 => 2  2 => 3  3 => 4  4 => 5  5 => 6  6 => 7  7 => 8]

待补充

参考文章

测试评估:14种排序算法和PHP数组:

转载地址:http://jjeql.baihongyu.com/

你可能感兴趣的文章
python 自动化对比返回结果
查看>>
SQLite分页语句
查看>>
adb server is out of date. killing...
查看>>
cesiumjs开发实践(六) CZML
查看>>
Delphi窗体中禁用最大化按钮
查看>>
K均值
查看>>
基于FPGA的dds发生器与lcd显示参数
查看>>
HDU-6216 A Cubic number and A Cubic Number [二分]
查看>>
php单例模式的使用场景,使用方法
查看>>
fetch请求get方式以及post提交参数为formdata类型的数据
查看>>
[学习笔记]凸优化/WQS二分/带权二分
查看>>
CentOS 下 LVS集群( 可能更新 )
查看>>
Scut游戏服务器免费开源框架--快速开发(3)
查看>>
手把手教你用express搭建个人博客(一)
查看>>
C语言学习感想
查看>>
android开发分辨率适配总结
查看>>
P1217 [USACO1.5]回文质数 Prime Palindromes
查看>>
WPF中ListBox的创建和多种绑定用法
查看>>
并发包读写锁
查看>>
并发包同步工具CyclicBarrier
查看>>