日常的排序算法中,快速排序是其中一种。实现起来相对简单。

假设有一个数组,有若干(N)个元素(数字且无序),需要对其进行从小到大的排序。

快速排序的思路是怎么样的呢?

取一个中间值,然后,用其他数组元素逐一和这个中间值比较,小于中间值的放在一个数组里,大于中间值的放到另一个数组里。

这样就以中间值为分界,分成了两个独立数组,一边都小于中间值,一边都大于中间值。这样就完成了一次大致的排序。

然后呢,针对这两个数组,做同样的操作,取中间值对比,再分成两个独立的数组,结果还是一边小,一边大。

直到这个数组最后只剩一个元素,就不需要操作了。然后把这两边数组,中间加上中间值,最终就是一个从小到大的排序了。

这个形式,符合递归的思想,重复做同样的事情,碰到一个特定的情况结束调用。

中间值,一般也就是取数组第一个元素,然后逐一和其对比。然后拆分成两个数组,然后只要该数组元素不唯一,则自己调用自己。将数组作为参数继续传递。

 function quick_sort($arr)
{
$left = $right = [];
$len = count($arr);//获取数组长度
if ($len <= 1) {
return $arr;//数组里只有一个元素的时候,返回(递归出口)
}
for ($i = 1; $i < $len; $i++) {//第一个元素做中间值比对,因此从第二个元素开始循环
if ($arr[$i] < $arr[0]) {
$left[] = $arr[$i];//小于中间值的存入左数组
} else {
$right[] = $arr[$i];//大于等于中间值的存入右数组
}
}
$left = quick_sort($left);//继续处理比对左边的数组
$right = quick_sort($right);//继续处理比对右边的数组
//将所有结果合并在一起组成每个阶段的有一定顺序的数组返回
return array_merge($left, array($arr[0]), $right);
} $arr = [5,2,4,7,8,5,4,2,6,8];
//调用
print_r(quick_sort($arr));

PHP快速排序(递归)的更多相关文章

  1. 笔试算法题(56):快速排序实现之非递归实现,最小k值选择(non-recursive version, Minimal Kth Selection of Quick Sort)

    议题:快速排序实现之五(非递归实现,短序列优先处理,减少递归栈大小) 分析: 算法原理:此算法实现适用于系统栈空间不足够快速排序递归调用的需求,从而使用非递归实现快速排序算法:使用显示下推栈存储快速排 ...

  2. 快速排序QuickSort

    前几天实现了直接插入排序.冒泡排序和直接选择排序这三个基础排序.今天看了一下冒泡排序的改进算法,快速排序.单独记录一下,后面还有归并和基数排序等 快速排序 1.选择一个支点默认为数组第一个元素及arr ...

  3. JavaScript 排序算法——快速排序

    常见排序 javaScript 实现的常见排序算法有:冒泡排序.选择排序.插入排序.谢尔排序.快速排序(递归).快速排序(堆栈).归并排序.堆排序. 过程 "快速排序"的思想很简单 ...

  4. python数据结构与算法第十二天【快速排序】

    1. 原理如图所示: 2.代码实现 def quick_sort(alist, start, end): """快速排序""" # 递归的退 ...

  5. 快速排序的php实现

    再来一个非常高级的排序算法,快速排序...这个算法是很高效的. 快速排序的思路是,找到一个分割点(中枢点 默认是列表第一个值),把原列表分隔成两部分,在分割点左侧的是都比它小的,在它右侧的是都比它大的 ...

  6. python算法之快速排序

    快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...

  7. python 快速排序详述

    快速排序是对“冒泡排序”的优化算法,都属于交换排序类. 描述:它通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速 ...

  8. 洛谷 P1177 【模板】快速排序

    这道题用传统快排(如下所示)的结果就是最后三个点TLE: void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } void ...

  9. python排序算法-冒泡和快速排序,解答阿里面试题

    ''常见的排序算法\ 插入排序/希尔排序/直接排序/堆排序 冒泡排序/快速排序/归序排序/基数排序 给定一个列表,将这个列表进行排序,要求:> 时间复杂度要小于O(n^2) 复杂度:1.时间复杂 ...

  10. 数据结构和算法(Golang实现)(25)排序算法-快速排序

    快速排序 快速排序是一种分治策略的排序算法,是由英国计算机科学家Tony Hoare发明的, 该算法被发布在1961年的Communications of the ACM 国际计算机学会月刊. 注:A ...

随机推荐

  1. Ext-JS-Modern-Demo 面向移动端示例

    基于Ext Js 6.5.2 面向移动端示例,低于此版本可能存在兼容问题,慎用 已忽略编译目录,请自行编译运行 Sencha Cmd 版本:v6.5.2.15 git地址:https://github ...

  2. java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=test]解决办法

    在进行简单的Junit单元测试时,测试一直报错: 先来看一下我的单元测试类: import org.junit.Test; import org.junit.runner.RunWith; impor ...

  3. CF1B Spreadsheets

    题意翻译 人们常用的电子表格软件(比如: Excel)采用如下所述的坐标系统: 第一列被标为A,第二列为B,以此类推,第26列为Z.接下来为由两个字母构成的列号: 第27列为AA,第28列为AB... ...

  4. ArcGIS AddIN 与ArcMap自带工具进行交互

    参考示例代码:C:\Program Files (x86)\ArcGIS\DeveloperKit10.1\Samples\ArcObjectsNet\Brushing 核心代码: //获取Selec ...

  5. js设计模式(六)---命令模式

    命令模式算是最简单.优雅的模式之一了,命令模式中的命令指的是一个执行某些特定事情的指令.目的是吧请求发送者和请求接受者解耦, 就像点餐,顾客只需要发送菜单,谁去接收,不用考虑.厨师接收到命令开始做菜, ...

  6. [ERROR] - Error reading string. Unexpected token: StartObject. Path 'formData', line 1, position 13.

    公司流程框架: businessData 为 string 所有要使用JSON.stringify();

  7. 使用FreeMarker生成word文档

    生成word文档的框架比较多,比如poi,java2word,itext和freemarker. 调研之后,freemarker来实现挺简单的,具体步骤如下: 1. 新建word文档,占位符用${}, ...

  8. MySQL优化小结

    数据库的配置是基础.SQL优化最重要(贯穿始终,每日必做),由图可知,越往上优化的面越小,最基本的SQL优化是最重要的,往上各个参数也没太多调的,也不可能说调一个innodb参数性能就会好多少,而动不 ...

  9. I2C驱动框架 (kernel-3.4.2)

    先用韦老师的图: 注:  新版本内核的i2c驱动框架采用了    i2c_client -------> i2c_bus_type  <-------- i2c_driver   框架 如 ...

  10. Spring Boot 注解配置 day03

    一.SpringBoot注解 @PropertySource 和 @ImportResource和@Bean 1.@PropertySource 加载指定位置的配置文件(只能是properties文件 ...