首页 经验

常见排序算法,说下快排过程,时间复杂度

时间: 2024-10-21 03:41:52

(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)


快速排序(Quick Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)策略。以下是快速排序的基本过程和时间复杂度分析。


快速排序过程


1. 选择基准(Pivot):从数组中选择一个元素作为基准。基准的选择可以有多种策略,例如选择第一个元素、最后一个元素、随机选择或选择中间元素等。


2. 分区(Partition):将数组重新排列,使得所有小于基准的元素都在基准的左侧,所有大于基准的元素都在基准的右侧。此时,基准元素的位置是它在最终排序数组中的位置。


3. 递归排序:对基准左侧和右侧的子数组递归地进行快速排序。


快速排序的伪代码


plaintext

function quicksort(array, low, high):

    if low < high:

        pivot_index = partition(array, low, high)

        quicksort(array, low, pivot_index - 1)  // Sort left subarray

        quicksort(array, pivot_index + 1, high) // Sort right subarray


function partition(array, low, high):

    pivot = array[high] // Choose the last element as pivot

    i = low - 1

    for j from low to high - 1:

        if array[j] < pivot:

            i += 1

            swap(array[i], array[j])

    swap(array[i + 1], array[high])

    return i + 1


时间复杂度分析


- 最佳情况:当每次选择的基准能将数组均匀分割时,时间复杂度为 $O(n \log n)$。这通常发生在数组是随机分布的情况下。


- 平均情况:平均情况下,快速排序的时间复杂度也是 $O(n \log n)$。


- 最坏情况:当数组已经是有序的(或逆序的),且每次选择的基准都是最小或最大元素时,快速排序的时间复杂度会退化为 $O(n^2)$。为了避免这种情况,可以使用随机选择基准或三数取中法(median-of-three)来优化基准选择。


空间复杂度


快速排序的空间复杂度为 $O(\log n)$,这是由于递归调用栈的深度。在某些实现中,可能会使用额外的空间来存储临时数组,但通常情况下,快速排序是一个原地排序算法。


总结


快速排序是一种高效且广泛使用的排序算法,适用于大多数情况,特别是当数据量较大时。通过合理选择基准,可以有效避免最坏情况的发生。


上一个 序数组排序,二分,复杂度 文章列表 下一个 有N个节点的满二叉树的高度。1+logN

最新

工具

© 2019-至今 适观科技

沪ICP备17002269号