欢迎访问宙启技术站
智能推送

快速排序算法实现

发布时间:2023-05-20 21:53:08

快速排序是一种高效的排序算法,常用于大量数据排序。它的思想是通过选择一个分界值,将数组分成两个部分,其中一部分所有元素小于分界值,另一部分所有元素大于分界值,递归地重复这个过程,直到整个数组有序。在实现快速排序时,需要注意以下几点:

1. 选择分界值

排序算法的效率与分界值的选择有关,在一些特定情况下,选择不合适的分界值可能导致算法效率降低,甚至导致算法的时间复杂度达到O(n^2)。一般来说,可以选择数组的中间元素作为分界值,这样可以尽可能地使得分成的两个数组大小相等。

2. 分区操作

分区操作时,需要从数组两边同时扫描,找到需要交换的元素,并交换它们。在实现分区操作时,需要注意以下几点:

(1)首先将分界值移动到数组的末尾,以便于方便进行操作。

(2)两个指针i和j分别指向数组的头和尾,i往后扫描,j往前扫描。

(3)当i遇到一个比分界值大的元素时,停止扫描;当j遇到一个比分界值小的元素时,停止扫描。

(4)如果i<j,则交换它们,继续扫描,直到i>=j。

(5)当i>=j时,将分界值和i所指向的元素交换,分界值就被放置到了i和j的交界处。

3. 递归实现

实现快速排序时,需要递归地调用自身对左右子数组进行排序。在每一次递归调用时,都要更新分界值的位置。

下面是快速排序的具体实现代码:

def quick_sort(arr, left, right):
    if left >= right:
        return
    pivot = arr[(left+right)//2]
    i, j = left, right
    while i <= j:
        while arr[i] < pivot:
            i += 1
        while arr[j] > pivot:
            j -= 1
        if i <= j:
            arr[i], arr[j] = arr[j], arr[i]
            i += 1
            j -= 1
    quick_sort(arr, left, j)
    quick_sort(arr, i, right)

arr = [5, 3, 8, 9, 2, 1, 7]
quick_sort(arr, 0, len(arr)-1)
print(arr)

快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)。它的优点在于排序效率高,适用于数据量较大的排序场景。但是在处理已经排好序的数组和数据量较小的场景中,快速排序的效率不如插入排序等简单排序算法。