php 快速排序算法,PHP快速排序算法实例分析

本文实例讲述了PHP快速排序算法。分享给大家供大家参考,具体如下:

快速排序:在无序的数组$data中,选择任意一个值作为对比值,定义i为头部检索索引,j为尾部检索索引,

算法步骤:

(1)初始化对比值$value=$data[0],$i=1,$j=count($data)-1

(2)首先从尾部开始检索,判断$data[$j]是否小于$value,若不小于则$j--,继续检索,直到找到比$value小的坐标

(3)这时开始头部检索,判断$data[$i]是否大于$value,若不大于则$i++,继续检索,直到找到比$value大的坐标

(4)这时$data[$j]与$data[$i]的值相互交换,即把比$value大的放到右边,把比$value小的放到左边

(5)重复3、4直到$i==$j

(6)这时已经把比$value大的放到右边,把比$value小的放到左边,确定了中间的坐标位置为$i,中间值为$value,把$data[$i]的值与$data[0]的值交换,因为中间值为$value,需要把$value挪到数组的中间坐标

(7)数组分成左右2个无序的数组,再分别递归执行1-6,直到数组长度为1

Tips:快速排序的中文定义百度下会更清楚

代码:

header("Content-type: text/html; charset=utf-8");

function quickSort($data, $startIndex, $endIndex){

if($startIndex < $endIndex){

$value = $data[$startIndex]; // 对比值

$startT = $startIndex + 1;

$endT = $endIndex;

while ($startT != $endT) {

// 找到比对比值小的坐标

while ($data[$endT] > $value && $endT > $startT){

$endT--;

}

// 找到比对比值大的左边

while ($data[$startT] < $value && $startT < $endT){

$startT++;

}

if($endT > $startT){

$temp =$data[$startT];

$data[$startT] = $data[$endT];

$data[$endT] = $temp;

}

}

// 防止数组已经排序好的情况

if($data[$startT] < $value){

$data[$startIndex] = $data[$startT];

$data[$startT] = $value;

}

$data = quickSort($data, $startIndex, $startT - 1);

$data = quickSort($data, $startT + 1, $endIndex);

return $data;

}else{

return $data;

}

}

$data = array(10, 5, 30, 22, 1, 42, 14, 34, 8, 13, 28, 36, 7);

$data = quickSort($data, 0, count($data) - 1);

var_dump($data);

运行结果:

array(13) {

[0]=>

int(1)

[1]=>

int(5)

[2]=>

int(7)

[3]=>

int(8)

[4]=>

int(10)

[5]=>

int(13)

[6]=>

int(14)

[7]=>

int(22)

[8]=>

int(28)

[9]=>

int(30)

[10]=>

int(34)

[11]=>

int(36)

[12]=>

int(42)

}

PS:这里再为大家推荐一款关于排序的演示工具供大家参考:

希望本文所述对大家PHP程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值