十大排序算法之快速排序

回眸只為那壹抹淺笑 提交于 2020-02-10 12:18:14

算法归类

简单排序:插入排序、选择排序、冒泡排序(必学)
分治排序:快速排序、归并排序(必学)
分配排序:桶排序、基数排序
树状排序:堆排序(必学)
其他:计数排序(必学)、希尔排序

快速排序

原理:核心思想是通过一个支点进行数据拆分,左边的数据小于这个支点,右边的数据大于支点,然后把左边和右边的做一次递归,直到递归结束。

phpcode实现

$data    = array(2, 1, 3, 9, 4, 6, 5, 8, 7);
$dataNum = count($data);
$leftIndex = 0;
$rightIndex = $dataNum - 1;

quickSort($data, $leftIndex, $rightIndex);
print_r($data);

function quickSort(&$data, $leftIndex, $rightIndex) {
    $i = $leftIndex;
    $j = $rightIndex;

    $pivot = $data[floor(($leftIndex+$rightIndex) / 2)];

    while($i <= $j) {
        while($data[$i] < $pivot) {
            $i++;
        }

        while($data[$j] > $pivot) {
            $j--;
        }

        if($i <= $j) {
            if($i != $j) {
                $temp = $data[$j];
                $data[$j] = $data[$i];
                $data[$i] = $temp;
            }
            $i++;
            $j--;
        }
    }

    if($leftIndex < $j) {
        quickSort($data, $leftIndex, $j);
    }

    if($i < $rightIndex) {
        quickSort($data, $i, $rightIndex);
    }

    return $data;
}

gocode实现

package main

import "fmt"

func main() {
    data := [9]int{2, 1, 3, 9, 4, 6, 5, 8, 7}
    dataNum := len(data)

    leftIndex := 0
    rightIndex := dataNum - 1
    quickSort(&data, leftIndex, rightIndex)
    fmt.Println(data)
}

func quickSort(data *[9]int, leftIndex, rightIndex int) {
    i := leftIndex
    j := rightIndex

    pivot := data[(leftIndex+rightIndex)/2]

    for i <= j {
        for data[i] < pivot {
            i++
        }

        for data[j] > pivot {
            j--;
        }

        if i <= j {
            if i != j {
                data[i], data[j] = data[j], data[i]
            }
            i++
            j--
        }
    }

    if i < rightIndex {
        quickSort(data, i, rightIndex)
    }

    if leftIndex < j {
        quickSort(data, leftIndex, j)
    }
}

稳定性:不稳定排序

空间复杂度
最优的情况下空间复杂度为:O(logn) ;每一次都平分数组的情况
最差的情况下空间复杂度为:O( n ) ;退化为冒泡排序的情况原地排序

时间复杂度:
平均情况:O(n log n)
最坏情况:O(n² )
最好情况:O(n log n)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!