快速排序 & 快速选择算法 Python实现

1.快速排序的基本思想——分治

q:无序数组
l:左端点
r:右端点
(1)确定分界点x
常用取法可为q[ l ],q[ (l + r) / 2 ],q[ r ], 随机取等
(2)调整区间
使区间左边的数均小于等于x,区间右边的数均大于等于x
(3)递归处理左右两段区间

2.暴力解法

(1)开辟两个新空间
a[ ],b[ ]
(2)遍历q[ l - r ]
q[ i ] <= x 存储到a[ ]
q[ i ] >= x 存储到b[ ]
(3)将ab两个数组合并为新数组
a[ ] → q[ ]
b[ ] → q[ ]

3.优美解法

(1)当i指向的数比x小时,i向右移,直到找到一个比x大的数
(2)当j指向的数比x大时,j向左移,直到找到一个比x小的数
(3)交换i、j位置的数,两个指针往前移动一位
(4)直至i、j相遇

4.快速排序Python代码实现

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

Python3:

def quick_sort(nums, l, r):
    if r <= l:
        return
    x = nums[(l + r) // 2]
    i, j = l - 1, r + 1
    while i < j:
        i += 1
        while nums[i] < x:  # 这里用小于号
            i += 1
        j -= 1
        while nums[j] > x: # 这里用大于号
            j -= 1
        if i < j:
            nums[i], nums[j] = nums[j], nums[i]
    quick_sort(nums, l, j) # 这里用 j 和 j + 1
    quick_sort(nums, j + 1, r)

n = input()
nums = [int(v) for v in input().split()]
quick_sort(nums, 0, len(nums) - 1)
for n in nums:
    print(n, end= " ")

5.快速选择算法(第k个数)

时间复杂度为 O(n)

基本思路:
SL:左边的数的个数
若 k <= SL,递归Left
若 k > SL,递归Right,注意此时找Right第 k - SL 小的数

6.快速选择算法Python代码实现

给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数

输入样例:

5 3
3 1 2 4 5

输出样例:

3

Python3:

def quick_sort(nums, l, r, k): # 和快排相比,多用一个参数k
    if r <= l:
        return
    x = nums[(l + r) // 2]
    i, j = l - 1, r + 1
    while i < j:
        i += 1
        while nums[i] < x:  # 这里用小于号
            i += 1
        j -= 1
        while nums[j] > x: # 这里用大于号
            j -= 1
        if i < j:
            nums[i], nums[j] = nums[j], nums[i]
    sl = j - l + 1 # 左侧数的个数
    if k <= sl: quick_sort(nums, l, j, k) # 这里用j
    else: quick_sort(nums, j + 1, r, k - sl) # 这里记得将新的k,替换为k-sl

a = input().split()
n = int(a[0])
k = int(a[1])
nums = [int(v) for v in input().split()]
quick_sort(nums, 0, len(nums) - 1, k)
print(nums[k-1])
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容