前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >排序算法-快速排序

排序算法-快速排序

作者头像
guanguans
发布2018-05-09 10:31:57
1K0
发布2018-05-09 10:31:57
举报
文章被收录于专栏:琯琯博客琯琯博客

排序算法-快速排序

代码语言:javascript
复制
<?php
/**
 * 快速排序.
 *
 * @param  array $value 待排序数组
 * @param  array $left  左边界
 * @param  array $right 右边界
 *
 * @return array
 */
function quick(&$value, $left, $right) {
    // 左右界重合 跳出
    if ($left >= $right) {
        return;
    }
    $base = $left;
    do {
        // 从最右边开始找到第一个比基准小的值,互换位置
        // 找到基准索引为止
        for ($i = $right;$i > $base;--$i) {
            if ($value[$i] < $value[$base]) {
                $tmp = $value[$i];
                $value[$i] = $value[$base];
                $value[$base] = $tmp;
                $base = $i; // 更新基准值索引
                break;
            }
        }
        // 从最左边开始找到第一个比基准大的值,互换位置
        // 找到基准索引为止
        for ($j = $left;$j < $base;++$j) {
            if ($value[$j] > $value[$base]) {
                $tmp = $value[$j];
                $value[$j] = $value[$base];
                $value[$base] = $tmp;
                $base = $j; // 更新基准值索引
                break;
            }
        }
    } while ($i > $j); // 直到左右索引重合为止
    // 开始递归
    // 以当前索引为分界
    // 开始排序左部分
    quick($value, $left, $i - 1);
    // 开始排序右边部分
    quick($value, $i + 1, $right);
    return $value;
}
/**
 * 快速排序.while版本
 *
 * @param  array $value 待排序数组
 * @param  array $left  左边界
 * @param  array $right 右边界
 *
 * @return array
 */
function quick_while(&$value, $left, $right) {
    // 左右界重合 跳出
    if ($left >= $right) {
        return;
    }
    $point = $left;
    $i = $right;
    $j = $left;
    while ($i > $j) {
        //查右边值
        while ($i > $point) {
            if ($value[$i] < $value[$point]) {
                $tmp = $value[$i];
                $value[$i] = $value[$point];
                $value[$point] = $tmp;
                $point = $i;
                break;
            }
            --$i;
        }
        //查左边值
        while ($j < $point) {
            if ($value[$j] > $value[$point]) {
                $tmp = $value[$j];
                $value[$j] = $value[$point];
                $value[$point] = $tmp;
                $point = $j;
                break;
            }
            ++$j;
        }
    }
    // 开始递归
    // 以当前索引为分界
    // 开始排序左部分
    quick_while($value, $left, $i - 1);
    // 开始排序右边部分
    quick_while($value, $i + 1, $right);
    return $value;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档