算法-快速排序-Python版详解

原题如下:

给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在 1∼10^9 范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5

1. 整体功能概述

快速排序思想:

代码来源

作者:Philosober
链接:https://www.acwing.com/activity/content/code/content/902188/

def quick_sort(l,r,data):
    if l >= r:
        return
    i = l - 1
    j = r + 1
    pivot = data[(i+j) // 2]
    while i < j:
        while 1:
            i += 1
            if data[i] >= pivot:
                break
        while 1:
            j -= 1
            if data[j] <= pivot:
                break
        if i < j:
            data[i],data[j] = data[j],data[i]
    quick_sort(l,j,data)
    quick_sort(j+1,r,data)


def main():
    l = 0
    r = n-1
    quick_sort(l,r,data)

if __name__ == "__main__":
    n = int(input())
    data = [int(x) for x in input().split()]
    main()
    print(' '.join(list(map(str, data))))

结果输出:

        这段代码实现了快速排序算法,用于对输入的一组整数进行排序,并在排序完成后输出排序后的结果。快速排序是一种高效的排序算法,它基于分治策略,通过选择一个 “枢轴”(pivot)元素,将数组分为两部分,左边部分的元素都小于等于枢轴,右边部分的元素都大于等于枢轴,然后递归地对这两部分进行排序。

2. 函数和模块结构

  • quick_sort函数:这是实现快速排序核心逻辑的函数,它接受三个参数:l(表示要排序的数组片段的左边界索引)、r(表示要排序的数组片段的右边界索引)和data(表示要排序的整数数组)。
  • main函数:主要用于设置排序的初始边界,并调用quick_sort函数进行排序。
  • if __name__ == "__main__"语句块中,获取用户输入的数组长度n和数组元素,然后调用main函数完成排序并输出结果。

3. quick_sort函数详细解释

(1)递归终止条件
if l >= r:
    return

当要排序的数组片段的左边界索引l大于等于右边界索引r时,说明该片段已经只有一个元素或者为空,此时不需要再进行排序,直接返回即可。

(2)初始化指针和选择枢轴
i = l - 1
j = r + 1
pivot = data[(i + j) // 2]
  • 首先,初始化两个指针iji初始化为左边界索引l减 1,j初始化为右边界索引r加 1。这里的初始化值是为了后续在循环中能正确地向中间移动指针并找到合适的元素与枢轴进行比较。
  • 然后,选择枢轴元素。这里通过data[(i + j) // 2]来选择枢轴,即取当前要排序的数组片段中间位置(这里的中间位置计算方式是先将ij相加再除以 2)的元素作为枢轴。
(3)主循环
while i < j:
    while 1:
        i += 1
        if data[i] >= pivot:
            break
    while 1:
        j -= 1
        if data[j] <= pivot:
            break
    if i < j:
        data[i], data[j] = data[j], data[i]
  • 外层while循环的条件是i < j,只要这两个指针还没有相遇,就继续循环进行元素的比较和交换操作。
  • 内层第一个while循环:不断将指针i向右移动(通过i += 1),直到找到一个大于等于枢轴pivot的元素。这里使用while 1:是为了让循环一直执行,直到满足if data[i] >= pivot:这个条件时通过break跳出循环。
  • 内层第二个while循环:与第一个内层循环类似,不断将指针j向左移动(通过j -= 1),直到找到一个小于等于枢轴pivot的元素。
  • 当内层两个循环都找到合适的元素(即i指向大于等于枢轴的元素,j指向小于等于枢轴的元素)后,如果i < j,说明这两个元素的位置不符合快速排序的要求(左边应该是小于等于枢轴的元素,右边应该是大于等于枢轴的元素),此时就交换data[i]data[j]这两个元素的位置,使得数组在ij这两个位置上的元素更符合快速排序的分区要求。
(4)递归调用
quick_sort(l, j, data)
quick_sort(j + 1, r, data)

        在完成一次ij指针的移动和元素交换操作后,数组被以j为界分成了两部分:左边部分(索引从lj)和右边部分(索引从j + 1r)。然后分别对这两部分递归地调用quick_sort函数进行排序,直到整个数组都被排序完成。

4. main函数详细解释

(1)设置初始边界
l = 0
r = n - 1

main函数中,首先设置了要排序的数组的初始左边界l为 0,右边界rn - 1,这里的n是数组的长度,在后续的代码(在if __name__ == "__main__"语句块中)会获取到用户输入的数组长度。

(2)调用快速排序函数
quick_sort(l, r, data)

        接着,调用quick_sort函数对整个数组(从索引 0 到索引n - 1)进行排序,传入的参数是设置好的初始边界lr以及要排序的数组data

5. if __name__ == "__main__"语句块详细解释

(1)获取用户输入
n = int(input())
data = [int(x) for x in input().split()]
  • 首先,通过int(input())获取用户输入的整数,这个整数表示要排序的数组的长度n
  • 然后,通过[int(x) for x in input().split()]获取用户输入的以空格分隔的整数序列,并将其转换为整数列表data,这个列表就是要进行排序的数组。
(2)调用main函数并输出结果
main()
print(' '.join(list(map(str, data))))
  • 首先调用main函数,在main函数中会完成对数组data的排序操作。
  • 最后,通过print(' '.join(list(map(str, data))))将排序后的数组元素以空格分隔的字符串形式输出。这里先使用list(map(str, data))将整数列表中的每个元素转换为字符串,然后使用join方法将这些字符串用空格连接起来,形成一个可以直接输出的字符串形式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值