说明
快排算法,比普通的冒泡排序要快,原因说明将在时间复杂度和空间复杂度的文章中说明。
PHP 实现
| 12
 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
 
 | <?php
 
 
 
 
 
 
 class Quick
 {
 public function __invoke(array $args)
 {
 $length = count($args);
 if ($length < 1) {
 return;
 }
 $this->quickSort($args, 0, $length - 1);
 
 return $args;
 }
 
 public function quickSort(array &$args, int $low, int $high)
 {
 if ($low > $high) {
 return;
 }
 
 $frist = $low;
 $last  = $high;
 $k     = $args[$low];
 
 
 while ($frist < $last) {
 
 while ($frist < $last && $args[$last] >= $k) {
 $last--;
 }
 $args[$frist] = $args[$last];
 
 
 
 
 echo PHP_EOL;
 while ($frist < $last && $args[$frist] <= $k) {
 $frist++;
 }
 $args[$last] = $args[$frist];
 
 
 
 
 
 
 }
 
 $args[$frist] = $k;
 
 
 $this->quickSort($args, $low, $frist - 1);
 $this->quickSort($args, $frist + 1, $high);
 }
 }
 
 $data = [3, 5, 1, 2, 8, 6, 7, 9];
 
 $sort     = new Quick();
 $sortData = $sort($data);
 
 print_r($sortData);
 
 | 
快速排序:
顾名思义,快速排序的基本思路是分治的思路,为什么这么说呢,因为他是一个整体排序的过程,但是他把数据分成了子数据段的排序
相信很多人看到这里还是一头雾水,我们按照这个说法,看看上面的例子。
我们现在有一批数字:[3, 5, 1, 2, 8, 6, 7, 9]
我们拿到基本数据元素:3。从后开始往前看,直到找到比 3 小的数据,我从 9-7-6-8-2(下标索引 j:7-6-5-4-3。j=3)看到 2 比 3 小,这个时候 3、2 交换位置。
[2,5,1,3,8,6,7,9]
然后从前开始往后看,直到找到比 3 大的数据
我从 2-5(下标索引 i:0,1。i=1)看到 5 比 3 大,这个时候 5、3 交换位置。
[2,3,1,5,8,6,7,9]
这个时候,我们发现 j 不等于 i,所以需要计算计算,直到 i=j 位置。
这个时候(j=3,i=1)。我们按照从后开始往前找的规律。从 5-1(下标索引 j:3-2。j=2)看到 1 比 3 小,这个时候,1,3 交换位置。
[2,1,3,5,8,6,7,9]
这个时候(j=2,i=1)。我们按照从前开始往后找的规律。当读 1 的时候(i=j=2),已经符合了我们的 j=i,这个时候,说明已经完成了一轮循环。
以上这个过程称之为一轮循环(从后面开始找小的,从前面开始找大的),这个时候,会发现,基础数据 3 左边都是小于 3 的,右边都是大于 3 的。以此循环,就是快排的基本思路。
如果想看数据变动的过程,可以把注释删掉,就可以看到每一次数据变动的情况了。