快速排序视频讲解(PHP快速排序算法实现的原理及代码详解)

本文目录
- PHP快速排序算法实现的原理及代码详解
- 按键精灵快速排序(比冒泡更快更有效率的算法)是怎么样的
- Excel怎么样排序 详解Excel表格的排序功能
- 快速排序方法的简单解释
- 快速排序第一趟结果是什么
- 快速排序,看了解释还是不会,求通俗点的
PHP快速排序算法实现的原理及代码详解
算法原理
下列动图来自五分钟学算法,演示了快速排序算法的原理和步骤。
步骤:
从数组中选个基准值
将数组中大于基准值的放同一边、小于基准值的放另一边,基准值位于中间位置
递归的对分列两边的数组再排序
代码实现
function
quickSort($arr)
{
$len
=
count($arr);
if
($len
《=
1)
{
return
$arr;
}
$v
=
$arr;
$low
=
$up
=
array();
for
($i
=
1;
$i
《
$len;
++$i)
{
if
($arr
》
$v)
{
$up
=
$arr;
}
else
{
$low
=
$arr;
}
}
$low
=
quickSort($low);
$up
=
quickSort($up);
return
array_merge($low,
array($v),
$up);
}
测试代码:
$startTime
=
microtime(1);
$arr
=
range(1,
10);
shuffle($arr);
echo
"before
sort:
",
implode(’,
’,
$arr),
"\n";
$sortArr
=
quickSort($arr);
echo
"after
sort:
",
implode(’,
’,
$sortArr),
"\n";
echo
"use
time:
",
microtime(1)
-
$startTime,
"s\n";
测试结果:
before
sort:
1,
7,
10,
9,
6,
3,
2,
5,
4,
8
after
sort:
1,
2,
3,
4,
5,
6,
7,
8,
9,
10
use
time:
0.0009009838104248s
时间复杂度
快速排序的时间复杂度在最坏情况下是O(N2),平均的时间复杂度是O(N*lgN)。
这句话很好理解:假设被排序的数列中有N个数。遍历一次的时间复杂度是O(N),需要遍历多少次呢?至少lg(N+1)次,最多N次。
1)
为什么最少是lg(N+1)次?快速排序是采用的分治法进行遍历的,我们将它看作一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的定义,它的深度至少是lg(N+1)。因此,快速排序的遍历次数最少是lg(N+1)次。
2)
为什么最多是N次?这个应该非常简单,还是将快速排序看作一棵二叉树,它的深度最大是N。因此,快读排序的遍历次数最多是N次。
您可能感兴趣的文章:PHP快速排序算法实例分析PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】PHP排序算法之快速排序(Quick
Sort)及其优化算法详解PHP递归实现快速排序的方法示例php
二维数组快速排序算法的实现代码PHP常用排序算法实例小结【基本排序,冒泡排序,快速排序,插入排序】PHP快速排序quicksort实例详解
按键精灵快速排序(比冒泡更快更有效率的算法)是怎么样的
冒泡排序为O(N^2),在排序过程中其实是效率较低的。在扫拍卖或者其他需要比拼速度的时候,时间就是金钱~越快越能抢占先机。
今天我们介绍另一种更快更有效率的排序——快速排序,时间复杂度为O(n*logn)。
快速排序的算法思想
快速排序采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
该方法的基本思想是:
1.先从数列中取出一个数作为基准数。(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3 . 再对左右区间重复第二步,直到各区间只有一个数。
白话讲解算法:
假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。就让第一个数6作为基准数吧。接下来,需要将这个序列中所有比基准数大的数放在6的右边,比基准数小的数放在6的左边。
方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵j指向序列的最右边(即=10),指向数字。
2014-8-29 13:45 上传
下载附件 (9.51 KB)
首先哨兵j开始出动。因为此处设置的基准数是最左边的数,所以需要让哨兵j先出动,这一点非常重要(请自己想一想为什么)。哨兵j一步一步地向左挪动(即j--),直到找到一个小于6的数停下来。接下来哨兵i再一步一步向右挪动(即i++),直到找到一个数大于6的数停下来。最后哨兵j停在了数字5面前,哨兵i停在了数字7面前。
2014-8-29 13:45 上传
下载附件 (9.74 KB)
2014-8-29 13:45 上传
下载附件 (8.13 KB)
现在交换哨兵i和哨兵j所指向的元素的值。交换之后的序列如下:
6 1 2 5 9 3 4 7 10 8
2014-8-29 13:45 上传
下载附件 (9.74 KB)
2014-8-29 13:45 上传
下载附件 (8.37 KB)
到此,第一次交换结束。接下来开始哨兵j继续向左挪动(再友情提醒,每次必须是哨兵j先出发)。他发现了4(比基准数6要小,满足要求)之后停了下来。哨兵i也继续向右挪动的,他发现了9(比基准数6要大,满足要求)之后停了下来。此时再次进行交换,交换之后的序列如下:
6 1 2 5 4 3 9 7 10 8
第二次交换结束,“探测”继续。哨兵j继续向左挪动,他发现了3(比基准数6要小,满足要求)之后又停了下来。哨兵i继续向右移动,糟啦!此时哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到3面前。说明此时“探测”结束。我们将基准数6和3进行交换。交换之后的序列如下:
3 1 2 5 4 6 9 7 10 8
2014-8-29 13:45 上传
下载附件 (8.28 KB)
2014-8-29 13:45 上传
下载附件 (10.45 KB)
2014-8-29 13:45 上传
下载附件 (8.48 KB)
到此第一轮“探测”真正结束。此时以基准数6为分界点,6左边的数都小于等于6,6右边的数都大于等于6。回顾一下刚才的过程,其实哨兵j的使命就是要找小于基准数的数,而哨兵i的使命就是要找大于基准数的数,直到i和j碰头为止。
OK,解释完毕。现在基准数6已经归位,它正好处在序列的第6位。
3
1
2
5
4
6
9
7
10
8
此时我们已经将原来的序列,以6为分界点拆分成了两个序列,左边的序列是“3 1 2 5 4”,右边的序列是“9 7 10 8”。接下来还需要分别处理这两个序列。因为6左边和右边的序列目前都还是很混乱的。不过不要紧,我们已经掌握了方法,接下来只要模拟刚才的方法分别处理6左边和右边的序列即可。现在先来处理6左边的序列现吧。
左边的序列是“3 1 2 5 4”。请将这个序列以3为基准数进行调整,使得3左边的数都小于等于3,3右边的数都大于等于3。
3
1
2
5
4
第一次交换完:以3为分界点,拆分了两个序列。左边都比3小,右边都比3大。
2
1
3
5
4
再分别处理3左右的两个序列“2 1”和“5 4”
1
2
3
4
5
这样,最初我们划分的6左侧的序列都已经处理好了~~我们再来处理6右侧的序列
9
7
10
8
以9为基准数,第一次交换完:
9
7
8
10
第二次交换:
8
7
9
10
再交换一次:
7
8
9
10
这样,我们整个序列就排序完毕了
1
2
3
4
5
6
7
8
9
10
快排算法代码实现:
su = "6|1|2|7|9|3|4|5|10|8"
su=Split(su, "|")
L = UBound(su)
Call ks(0, L)
Function ks(L, B)
If L 》 B Then
Exit Function
End If //判断数组上标下标是否超出范围
i = L
j = B
key =int( su(L) ) //数组第一位提取作为基数
While j》i
While int ( su(j)) 》= key and j 》 i //要先从最右边开始找 找到第一个小于key的数 这里添加的j》i的判断是为了防止j的值不断递减导致下标越界
j = j - 1
Wend
While int (su(i)) 《= key and j 》 i //从最左边开始找 找到第一个大于key的数 (这里的字符串数组需要转换为数值型)
i = i + 1
Wend
If j》i then // 将和基数key对比得到的两个数对换 将大于key的值往右边放 小于key的值往左边放
T = su(i)
su(i) = su(j)
su(j) = T
End If
Wend // 这个 While 循环当i=j 第一轮比较完退出
su(L) = su(i) // 重新设置数组第一个元素为基数
su(i) = key// 基数归位 (排完一轮之后 左边的数《基数《右边的数 那么基数就到了排序中它该在的位置。)
Call ks(L, i - 1)//继续处理左边的数
Call ks(i + 1, B)//继续处理右边的数
End Function
For i = 0 To UBound(su)
TracePrint su(i)
Next
Excel怎么样排序 详解Excel表格的排序功能
4. 点击“确定”按钮,完成排序。
4. 快速排序:Excel表格提供了快速排序的功能,可以快速地将表格中的数据按照指定的规则进行排序。
综上所述,Excel表格的排序功能是非常重要的一项功能,可以帮助用户更好地处理和分析数据。在使用Excel表格的排序功能时,需要注意以上几点,以确保排序结果符合预期。
四、Excel表格的排序功能的注意事项
2. 在进行多列排序时,需要设置好每列的优先级,
2. 点击“数据”菜单中的“排序”按钮,打开排序对话框。
快速排序方法的简单解释
快排的思想是(假设都是从小到大排列):
选一个值作为“轴值”,所有小于轴值的都移动到轴值左边,所有大于轴值的都移动到轴值右边。这一步是让数列变得较为有序
然后分别再对轴值的左边、右边分别进行快排,一步一步提高整个数列的有序程度,直到最后完全有序。
轴值的选取有多种方式,这里就假设是选正中间的一个
70,75,82,90,23,16,10,68
选择轴值 90,排列后得到:
70,75,82,23,16,10,68,(90)
括号括起来的我表示是轴值,这里运气不好,轴值选中了一个最大的
下面对轴值左边排序,在选择轴值为23:
16,10,(23),70,75,82,68
再分别对16, 10 和 70,75,82,68进行排序
一般快排在待排序的数字个数较少时,会选取其它排序来进行排列,比如插入排序。这里16,10数字个数已经太少,用插入排序排成10, 16
然后对 70,75,82,68进行排序……
整个排序过程就这样
快速排序第一趟结果是什么
快速排序第一趟的结果是:将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。
快速排序整个排序过程可以递归进行,以此达到整个数据变成有序序列。
扩展资料
快速排序流程:
1、首先设定一个分界值,通过该分界值将数组分成左右两部分。
2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。
3、左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
快速排序,看了解释还是不会,求通俗点的
快速排序简单的说就是选择一个基准,将比起大的数放在一边,小的数放到另一边。对这个数的两边再递归上述方法。
如本题
66 13 51 76 81 26 57 69 23,以66为基准,升序排序的话,比66小的放左边,比66大的放右边, 类似这种情况 13 。。。 66。。。69
具体快速排序的规则一般如下:
从右边开始查找比66小的数,找到的时候先等一下,再从左边开始找比66大的数,将这两个数借助66互换一下位置,继续这个过程直到两次查找过程碰头。
例子中:
66 13 51 76 81 26 57 69 23
从右边找到23比66小,互换
23 13 51 76 81 26 57 69 66
从左边找到76比66大,互换
23 13 51 66 81 26 57 69 76
继续从右边找到57比66小,互换
23 13 51 57 81 26 66 69 76
从左边查找,81比66大,互换
23 13 51 57 66 26 81 69 76
从右边开始查找26比66小,互换
23 13 51 57 26 66 81 69 76
从左边开始查找,发现已经跟右边查找碰头了,结束,第一堂排序结束
下面排序C语言的排序快速代码,参考一下
void sort(int *a, int left, int right)
{
if(left 》= right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/
{
return ;
}
int i = left;
int j = right;
int key = a;
while(i 《 j) /*控制在当组内寻找一遍*/
{
while(i 《 j && key 《= a)
/*而寻找结束的条件就是,1,找到一个小于或者大于key的数(大于或小于取决于你想升
序还是降序)2,没有符合条件1的,并且i与j的大小没有反转*/
{
j--;/*向前寻找*/
}
a;
/*找到一个这样的数后就把它赋给前面的被拿走的i的值(如果第一次循环且key是
a,那么就是给key)*/
while(i 《 j && key 》= a)
/*这是i在当组内向前寻找,同上,不过注意与key的大小关系停止循环和上面相反,
因为排序思想是把数往两边扔,所以左右两边的数大小与key的关系相反*/
{
i++;
}
a;
}
a = key;/*当在当组内找完一遍以后就把中间数key回归*/
sort(a, left, i - 1);/*最后用同样的方式对分出来的左边的小组进行同上的做法*/
sort(a, i + 1, right);/*用同样的方式对分出来的右边的小组进行同上的做法*/
/*当然最后可能会出现很多分左右,直到每一组的i = j 为止*/
}

更多文章:
汇编语言期末试卷(一道汇编语言编程题!急求大神解答明天期末考试就要考了务必按照试卷上的要求来回答好的话有Q币)
2026年10月14日 16:30
汇编语言pdf下载(《Windows环境下32位汇编语言程序设计》资料下载)
2026年10月14日 13:40
获取innertext(在js中如何获取input标签的text值)
2026年10月14日 02:00
跨文件vlookup怎么用详细步骤(vlokkup函数怎么用)
2026年10月14日 01:30
伦勃朗老年自画像(《大师经典伦勃朗》封面上的这张图叫什么名字急!)
2026年10月13日 22:40






