📜  门| GATE-CS-2001 |第 41 题(1)

📅  最后修改于: 2023-12-03 15:42:14.919000             🧑  作者: Mango

题目介绍

本题为 2001 年 GATE-CS 的第 41 题。该题是一道算法题,要求实现一个非递归的快速排序算法。

题目描述

给定一个数组,使用非递归的方式实现快速排序。

思路分析

快速排序是一种基于分治思想的排序算法,它的思路是选择一个数作为基准,将数组中比它小的数移到左侧,比它大的数移到右侧,然后分别对左右两侧的数组递归进行同样的操作。最终得到一个有序的数组。

非递归实现快速排序的思路,便是使用栈来模拟递归的过程,将待排序的子数组的起始下标和结束下标放入栈中,当栈不为空时,取出一个下标对并对该子数组进行快速排序。

代码实现

以下是非递归的快速排序的代码实现:

def quick_sort(arr, start, end):
    stack = [(start, end)]
    while stack:
        start, end = stack.pop()
        if end - start < 1:
            continue
        left, right = start, end
        pivot = arr[left]
        while left < right:
            while left < right and arr[right] >= pivot:
                right -= 1
            arr[left] = arr[right]
            while left < right and arr[left] <= pivot:
                left += 1
            arr[right] = arr[left]
        arr[left] = pivot
        stack.append((start, left - 1))
        stack.append((left + 1, end))

arr = [3, 7, 1, 0, 9, 4, 2, 8, 6, 5]
quick_sort(arr, 0, len(arr)-1)
print(arr)   # 输出 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

在代码中,我们使用栈模拟递归的过程,每次从栈中取出下标对 (start, end),表示对数组 arr[start:end+1] 进行快速排序。接下来,我们使用双指针的方式将数组分为小于基准值和大于基准值的两部分。最后,将基准值放回分界线上,将左右两侧的子数组起始和结束下标压入栈中,继续进行快速排序,直到栈为空。