常用的排序算法系列

快速排序

假设当前需要从小到大进行排序,快速排序的核心思路是,从当前数组中,找到一个元素作为基准比较值(key),分别从两个方向进行比较。从后往前找,比key小元素放在数组前面。然后从前往后找,比key大的元素放在数组后面。最终两个方向交汇到中间,让key交换到数组的中间位置。

举例说明:

首先,常见的取key方式是,取当前排序数组范围的最左边第一位。(取最右边末尾也可以,但是操作顺序需要调成对称相反的模式)

假设当前需要排序的数组如下:

[ 34, 5, 5, 555, 5, 4, 14, 5, 88, 89, 54]

那么,可以先取34作为一个基准的比较值(key),也就是 key=34

因为我们的key是从前边取的,所以先要从后边(右边)开始往前找数字。

(如果是key从末尾取54,那么就需要先从前边开始往后找数字)

令left为第一位0,令right为最末位数组长度n。

那么,key是从前边取,我们就需要先从right开始,从后往前走。

如果 a[right]>=key(即34),说明是正常的,因为大数字就应该放后面。

因此,right继续往前走,也就是right--。

直到出现 a[right]

继续,不要忘记,快速排序的核心思路是,从当前数组中,找到一个元素作为基准比较值(key),分别从两个方向进行比较。从后往前找,比key小元素放在数组前面。然后从前往后找,比key大的元素放在数组后面。最终两个方向交汇到中间,让key交换到数组的中间位置。

从后往前找小数,已经找到了一个位置了,那么就换一个方向,从前往后找大数。

因此从left开始,从前往后走。

如果 a[left]<=key(即34),说明是正常的,因为小数字就应该放前面。

因此,left 继续往后走,也就是left++。

(这里可以看出,left 和 right 的操作是对称的)

直到出现 a[left]>key, 这就说明有一个大数字出现在了前面,至于它是不是真的属于前面?这个就需要判断 left 和 right 的关系。

如果 left < right ,说明数组的中间位置还夹在 left 和 right 之间,因此 left 标记的位置属于前面,right 标记的位置属于后面。

此时,一个大数字出现在了前面,一个小数字出现在了后面,因此我们直接将其互换,将 ar[left] 和 ar[right] 互换。

互换完之后,当前的标记位left和right 继续两边往中间走。同理,先从right继续从后往前走,直到遇见一个小数字(比key小)。然后换方向从left继续从前往后走,直到遇见一个大数字(比key大)

如果不满足left < right ,而是left = right,说明以及抵达了数值的中心,这时候我们需要做的是把key换到这个中间的地方,这就完成了一轮的快速排序。

完成了这一轮的快速排序之后,就会发现,这个数组可以拆分成左半部分和右半部分。

左半部分是 从 第一位 到 left-1(此时left在中心标记位),里面的数字都比中心的key小。

右半部分是 从 left+1 到 最末位 ,里面的数字都比中心的key大。

因此,我们就可以继续递归地对左半部分和右半部分使用快速排序即可。

直到最终, 开始的left >= 开始right ,说明已经是拆成1个数字了,就没必要再比下去了。

排序的结果就完成了。

整个流程如图所示:

PHP代码运行如图:

PHP版本的实现代码如下

/**

* Created by PhpStorm.

* User: L

* Date: 2018-9-27

* Time: 16:45

*/

$ar = [34, 5, 5, 555, 5, 4, 14, 5, 88, 89, 54];

print_r(json_encode($ar));

quick($ar);

print_r(json_encode($ar));

/** 快速排序 找基准数 左右分组交换至左小右大

* @param array $ar

* @param int $left

* @param null $right

*/

function quick(array & $ar, $left = 0, $right = null)

{

//default left = 0 ,right = len-1

if ($right === null) {

$right = sizeof($ar) - 1;

}

if ($left >= $right) {//not need to sort

return;

}

//mark the default value

$first_index = $left;

$last_index = $right;

$key = $ar[$left];//default key as first element

while ($left != $right) {//find 2 swap element to sort into 2 parts

while ($ar[$right] >= $key && $left < $right) { // [l--r] is [small--big]

$right--;

}//until a[r] < key

while ($ar[$left] <= $key && $left < $right) {

$left++;

}//until a[l] > key

if ($left < $right) { //swap

echo "
swap ar[$left] = $ar[$left] ar[$right] = $ar[$right]
";

$t = $ar[$left];

$ar[$left] = $ar[$right];

$ar[$right] = $t;

}

}//finish 2 sorted parts

//left == right == mid

if ($first_index != $left) {//first_index == mid_index not need to swap, just len = 1

echo "put key ar[$first_index] = $key ar[$left] =$ar[$left]
";

//put mid to first(location of key)

$ar[$first_index] = $ar[$left];

//put key into mid

$ar [$left] = $key;

}

print_r(json_encode($ar));

//continue cut and sort

//left == right == mid

echo "
cut into: $first_index ---- | $left |---- $last_index
";

quick($ar, $first_index, $left - 1);

quick($ar, $left + 1, $last_index);

}

php1到5000排序,常用的排序算法(一)--快速排序(PHP实现)相关推荐

  1. 冒泡排序、插入排序、选择排序、希尔排序、堆排序、归并排序等常用排序算法的比较

    掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间.每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中 ...

  2. 常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度                                           1.时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出 ...

  3. 视觉直观感受7种常用的排序算法

    1 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通 ...

  4. STL常用的排序算法

    常用的排序算法 merge() sort() random_shuffle() reverse() merge() 以下是排序和通用算法:提供元素排序策略 merge: 合并两个有序序列,存放到另一个 ...

  5. 常用的排序算法的时间复杂度和空间复杂度 .

    常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 O(n2) O(n*log2n) 不稳定 ...

  6. 数据结构-常用的排序算法

    总第123篇 好久不见哈,我终于又更新了,惊不惊喜,意不意外,哈哈哈哈.等之后会专门写一篇文章给大家汇报汇报我最近在忙什么呢,今天这篇还是接着之前的数据结构系列继续,主要讲讲数据结构里面常用的几种排序 ...

  7. 算法基础:常用的排序算法知识笔记

    1.算法外排序分类 2.冒泡排序 冒泡排序(Bubble Sort)属于交换排序,它的原理是:循环两两比较相邻的记录,如果反序则交换,直到没有反序的记录为止. 实现算法: /** * 冒泡排序优化后的 ...

  8. php递归算法排序,php常用的排序算法代码[冒泡,递归排序-PHP源码

    <script>ec(2);<script> php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法 function bubblesort($arr) { $n=count ...

  9. 插入排序 php,常用的排序算法(二)--插入排序(PHP实现)

    常用的排序算法系列 插入排序 插入排序是一种逻辑上非常好理解的排序方式,整个排序的核心就是不断在当前已经排好部分数据的数组里,找到合适的位置插入新数据.就像抓扑克牌,抓一张,然后再手里已经部分已经排好 ...

最新文章

  1. React 组件之间传递参数
  2. OSM OpenStreetMap 获取城市路网数据及转为ESRI shp数据的方法
  3. ubuntu更换软件源方法和实验成功软件源地址
  4. MyCP(课下作业,必做)
  5. [蓝桥杯2016决赛]反幻方-next_permutation枚举
  6. Magento教程 15:Magento 批次修改产品资料
  7. 像 C 一样快,Ruby 般丝滑的 Crystal 发布 1.0 版本,你看好吗?
  8. e生保等待期什么意思_买了保险不知道赔什么?一文看懂【保险责任】
  9. c#2.0语法新关键字 partial
  10. Java后台入坑二:renrenfast后台打包和前端打包运行
  11. 微信小程序UI组件库合集
  12. 经验谈:调查问卷问题设计“六忌”
  13. 指数型组织:未来组织发展的必然趋势
  14. 量化交易1-backtrader介绍
  15. 给大家分享一下指纹挂锁的方案
  16. 【英语语法入门】 第29讲 情态动词的否定和疑问
  17. 弱网工具-NEWT应用
  18. 华脉智联校园可视化智慧安全感知处置系统解决方案
  19. 奋斗5年,从月薪三千五到七百万
  20. ISPRS2018/云检测:Cloud/shadow detection based on spectral indices for multi/hyp基于光谱指数的多/高光谱光学遥感成像仪云/影检测

热门文章

  1. 想学 AI,先搞懂这件小事!
  2. iPhone 11 引领芯片新革命?
  3. 一文弄懂二叉树三种遍历
  4. 程序员降薪求职到底该不该?
  5. 网络编程函数小总结与初识socket
  6. 给Java程序员的一些面试建议,大厂面试题汇总
  7. java抓取百度搜索结果_java实现抓取百度对某站点搜索结果
  8. 2014年3月计算机四级网络工程师考试试题及答案,某年3月计算机等级考试四级网络工程师笔试试题...
  9. linux spoon.sh闪退,kettle使用spoon.sh打开报错问题解决
  10. php函数总结,php函数