快速排序(Quick Sort)是对冒泡排序的一种改进,属不稳定排序算法,由东尼·霍尔在1962年提出。快速排序基本步骤:从数列中挑出一个元素(一般称为称为“基准”),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比基准小,另外一部分的所有数据都比基准大,与基准相等的数据可放在两部分中的任一部分,然后再按此方法递归地对这两部分数据分别进行处理,以达到整个数据变成有序序列。快速排序,最好情况下,时间复杂度为O(nlogn);最坏情况下,时间复杂度为O(n2);平均时间复杂度为O(nlogn)。

快速排序示例图:

PHP实现快速排序算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
/**
 
* 数据结构与算法(PHP实现) - 快速排序(Quick Sort)。
 
*
 
* @author 创想编程(TOPPHP.ORG)
 
* @copyright Copyright (c) 2013 创想编程(TOPPHP.ORG) All Rights Reserved
 
* @license http://www.opensource.org/licenses/mit-license.php MIT LICENSE
 
* @version 1.0.0 - Build20130614
 
*/
class
QuickSort {
  
/**
   
* 需要排序的数据数组。
   
*
   
* @var array
   
*/
  
private
$data
;
 
  
/**
   
* 数据数组的长度。
   
*
   
* @var integer
   
*/
  
private
$size
;
 
  
/**
   
* 数据数组是否已排序。
   
*
   
* @var boolean
   
*/
  
private
$done
;
 
  
/**
   
* 构造方法 - 初始化数据。
   
*
   
* @param array $data 需要排序的数据数组。
   
*/
  
public
function
__construct(
array
$data
) {
    
$this
->data =
$data
;
    
$this
->size =
count
(
$this
->data);
    
$this
->done = FALSE;
  
}
 
  
/**
   
* 交换数据数组中两个元素的位置。
   
*
   
* @param integer $x 元素在数组中的索引。
   
* @param integer $y 元素在数组中的索引。
   
*/
  
private
function
swap(
$x
,
$y
) {
    
$temp
=
$this
->data[
$x
];
    
$this
->data[
$x
] =
$this
->data[
$y
];
    
$this
->data[
$y
] =
$temp
;
  
}
 
  
/**
   
* 快速排序。
   
*
   
* @param integer $left 数组第一个元素索引。
   
* @param integer $right 数组最后一个元素索引。
   
*/
  
private
function
sort(
$left
,
$right
) {
    
if
(
$left
>=
$right
) {
      
return
;
    
}
 
    
$pivot
=
$this
->data[
$left
];
    
$start
=
$left
;
    
$end
=
$right
;
 
    
while
(
$start
<
$end
) {
      
while
(
$start
<
$end
&&
$this
->data[
$end
] >=
$pivot
) {
        
--
$end
;
      
}
 
      
$this
->swap(
$start
,
$end
);
 
      
while
(
$start
<
$end
&&
$this
->data[
$start
] <
$pivot
) {
        
++
$start
;
      
}
 
      
$this
->swap(
$start
,
$end
);
    
}
 
    
$this
->sort(
$left
,
$start
- 1);
    
$this
->sort(
$start
+ 1,
$right
);
  
}
 
  
/**
   
* 获取排序后的数据数组。
   
*
   
* @return array 返回排序后的数据数组。
   
*/
  
public
function
getResult() {
    
if
(
$this
->done) {
      
return
$this
->data;
    
}
 
    
$this
->sort(0,
$this
->size - 1);
    
$this
->done = TRUE;
 
    
return
$this
->data;
  
}
}
?>

示例代码
1
2
3
4
<?php
$quick
=
new
QuickSort(
array
(5, 3, 8, 9, 6, 2));
echo
'<pre>'
, print_r(
$quick
->getResult(), TRUE),
'</pre>'
;
?>

PHP实现快速排序算法的更多相关文章

  1. 快速排序算法 java 实现

    快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...

  2. C# 集合扩展快速排序算法

    /// <summary> /// 对集合进行排序,如 /// List<Person> users=new List<Person>(){.......} /// ...

  3. PHP描述冒泡排序和快速排序算法

    使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用 ...

  4. 快速排序算法(Java)

    快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class Parti ...

  5. 快速排序算法-C语言实现

    注:本篇内容为翻译,之所以选择这篇进行翻译原因是该文章含有动画,能够更加直观地展示快速排序.同时,可以仔细看一下代码,代码中把结构化的思想给予了更加充分地表现.按照功能进行模块划分的思想得到了彻底地贯 ...

  6. C#快速排序算法基础入门篇

    相信算法对于许多开发人员来说都是一大难点,之所以难,就像设计模式一样,许多人在阅读之后,没有很好地理解,也不愿意动手上机操作,只停留在理论的学习上面,随着时间推移就慢慢淡忘. 有些东西,你可以发明创造 ...

  7. 快速排序算法 Quick sort

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046189.html 首先随机选择一个轴,并调整数组内各个数字,使得比轴值大的数在轴的右边, ...

  8. Java快速排序算法

    快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...

  9. 排序系列 之 快速排序算法 —— Java实现

    基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...

随机推荐

  1. 能够返回运行结果的system函数加强版本号

    /*********************************************************************  * Author  : Samson  * Date   ...

  2. Servlet的学习之Session(4)

    在本篇中,我们来使用Session完成一个用户登录的案例,前提声明:这个案例主要用于学习Session技术,是属于比较简单的类型,以后会采用MVC模式来开发登录,那就会比较复杂. 现在大多数网站都提供 ...

  3. cPickle.so:: PyUnicodeUCS2_DecodeUTF8

    cPickle.so:: PyUnicodeUCS2_DecodeUTF8错误 Python编译的参数,和Python module(mod_wsgi, pymodwsgi)编译参数不一,导致一些un ...

  4. Delphi中使用GDI+进行绘图(2)

    2)使用IGDIPlus接口 (1)下载安装所需软件 可以在以下地址下载IGDI+最新的安装程序. http://www.mitov.com/products/igdi+ www.igdiplus.o ...

  5. c++/c/java 资源共享群

    Hi,我邀请你加入360云盘文件共享群:c++&c&java, 打开邀请链接:http://qun.yunpan.360.cn/10005202 , 输入邀请码:1357

  6. 浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer

    文章来源:http://www.outflush.com/2015/03/introduction-of-arc-bridge-type-transfer/ 在对 bridge 相关的修饰符解说前.首 ...

  7. CorePlot学习

    阅读这篇文章,指出它在国外    原文地址:https://github.com/core-plot/core-plot/wiki/High-Level-Design-Overview 强烈推荐阅读该 ...

  8. Delphi使用StrToDatetime在不同操作系统出现不同的情况(控制面板的时间格式都记录在注册表里,因此也可修改注册表)

    Str:=  '2010-4-13  06:22:22'; StrToDateTime(Str); 现象:在WinXP, Win2003 都不会报错 但是在Windows7,Windows Serve ...

  9. LeetCode——Populating Next Right Pointers in Each Node II

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  10. java中Hashtable中的t为什么是小写(转)

    因为在很多年前刚学java的时候用到Hashtable的时候比较好奇为什么第二个t是小写,这不符合sun的风格啊,整个jdk都是标准驼峰,于是带着这个疑问翻过 很多书,看多很多资料,最后的结论是: H ...