算法原理:

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

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);
}

quickSort

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";