算法原理:
速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此实现整个数据变成有序序列。
java
public static void quickSort(int[] array, int left, int right) {
if (left < right) {
int pivot = array[left];
int low = left;
int high = right;
while (low < high) {
while (low < high && array[high] >= pivot) {
high--;
}
array[low] = array[high];
while (low < high && array[low] <= pivot) {
low++;
}
array[high] = array[low];
}
array[low] = pivot;
quickSort(array, left, low - 1);
quickSort(array, low + 1, right);
}
}
php
function quickSort(&$arr, $min, $max) {
if ($min >= $max) {
return;
}
$mid = $arr[$min];
$left = $min;
$right = $max;
while ($left < $right) {
// 正序
// while ($left < $right && $arr[$right] >= $mid) {
// 倒序
while ($left < $right && $arr[$right] <= $mid) {
$right--;
}
$arr[$left] = $arr[$right];
// 正序
// while ($left < $right && $arr[$left] <= $mid) {
// 倒序
while ($left < $right && $arr[$left] >= $mid) {
$left++;
}
$arr[$right] = $arr[$left];
}
$arr[$left] = $mid;
quickSort($arr, $min, $left - 1);
quickSort($arr, $left + 1, $max);
}
e2.php
<?php
for ($i = 0; $i < 10; $i++) {
$arr[] = rand(1, 50);
}
function dump($arr, $i = null, $j = null, $start = null, $end = null, $pivot = null, $pivotPoint = null) {
$str = '';
foreach ($arr as $key => $value) {
if ($i !== null && $key == $i) {
if ($key == $pivotPoint) {
$value = $pivot;
}
$str .= "[" . $value . "]\t";
continue;
}
if ($j !== null && $key == $j) {
if ($key == $pivotPoint) {
$value = $pivot;
}
$str .= "[" . $value . "]\t";
continue;
}
$str .= $value . "\t";
}
if ($i !== null) {
echo $str . "i:$i\tj:$j\tstart:$start\tend:$end\tpivot:$pivot\n";
} else {
echo $str . "\n";
}
}
dump($arr);
// 快速排序
function quickSort($arr, $start, $end) {
if ($start >= $end) {
return $arr;
}
//基数
$pivot = $arr[$start];
$i = $start;
$j = $end;
while ($i < $j) {
//找出小于基数的数调换后找出大于基数的数调换,循环此步骤
while ($i < $j && $arr[$j] >= $pivot) {
$j--;
}
dump($arr, $i, $j, $start, $end, $pivot, $i);
$arr[$i] = $arr[$j];
while ($i < $j && $arr[$i] <= $pivot) {
$i++;
}
dump($arr, $i, $j, $start, $end, $pivot, $j);
$arr[$j] = $arr[$i];
}
$arr[$i] = $pivot;
dump($arr);
$arr = quickSort($arr, $start, $i - 1);
$arr = quickSort($arr, $i + 1, $end);
return $arr;
}
//引用$arr
function quickSort1(&$arr, $min, $max) {
if ($min >= $max) {
return;
}
$mid = $arr[$min];
$left = $min;
$right = $max;
while ($left < $right) {
// 正序
// while ($left < $right && $arr[$right] >= $mid) {
// 倒序
while ($left < $right && $arr[$right] <= $mid) {
$right--;
}
$arr[$left] = $arr[$right];
// 正序
// while ($left < $right && $arr[$left] <= $mid) {
// 倒序
while ($left < $right && $arr[$left] >= $mid) {
$left++;
}
$arr[$right] = $arr[$left];
}
$arr[$left] = $mid;
quickSort($arr, $min, $left - 1);
quickSort($arr, $left + 1, $max);
}
echo "start\n";
$arr = quickSort($arr, 0, count($arr) - 1);
echo "end\n";