备战蓝桥杯Day9- 快速排序

一、每日一题

自己写的代码:

 这道题还是挺简单的,用之前学习的哈希表统计每个元素的个数,再与 n // 2进行比较即可。我的代码还有可以简化改进的地方,大家也可以试试。

def Duo(nums):
    n = len(nums)
    num_count = {}
    for i in nums:
        num_count[i] = num_count.get(i, 0) + 1
        if num_count.get(i, 0) > n // 2:
            print(i)


nums = [2,2,1,1,1,2,2]
Duo(nums)

二、快速排序

快速排序的优点就是 快!

排序要点:

        取一个元素p(第一个元素),使p元素归位。

        列表被p分成两部分,左边比p都小,右边比p都大。

        递归完成排序。

 

快速排序的清晰思路过程:

  1. 选择基准元素:从数组中选择一个元素作为基准(pivot)。通常情况下,可以选择数组的第一个元素、最后一个元素或者中间的元素作为基准。

  2. 分区过程:将数组中的元素按照基准元素的大小分成两部分,小于基准的放在左边,大于基准的放在右边。这个过程可以使用两个指针来实现,一个指向数组的起始位置,另一个指向数组的末尾,然后向中间移动,直到两个指针相遇。这个分区过程单独写一个函数,在快速排序函数中递归调用

  3. 递归排序:对分区后的左右两部分进行递归排序。重复上述步骤,直到每个子数组的大小为 0 或 1,即已经排好序。

 举例详细图解

举得例子有点麻烦,超级多,但是很清楚,有很多重复的,大家可以略看。

绿色框指的是left指针指向空时,找比p大的数,蓝色框找p小的数。

(函数名partition打错了,小细节别介意,懒得改了。)

 

 (以上都是我自己做的ppt截的图,如有需要请注明出处。)

根据思路写出代码: 

def partition(li, left, right):
    tmp = li[left]  # 将第一个元素设置成变量
    while left < right:  # 要保证区间内有数字
        while left < right and li[right] >= tmp:  # 从右面找比tmp大的数
            right -= 1  # 右边的下标往左移
        li[left] = li[right]  # 把右边的值写到左边空位上
        while left < right and li[left] <= tmp:  # 从左面找比tmp小的数
            left += 1   # 左边的下标往右移
        li[right] = li[left]  # 把左边的值写到右边空位上
    li[left] = tmp  # 把tmp归位
    return left


def quick_sort(li, left, right):
    if left < right:
        mid = partition(li, left, right)
        quick_sort(li, 0, mid - 1)
        quick_sort(li, mid + 1, right)


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

运行结果: 

 

三、学习总结 

学习到了排序NB三人组之快速排序,不得不说感觉一下子上难度了,整上函数递归了,不过姐还是看懂了哈哈哈,但是还需要再加强写代码练习,第一天学的哈希表姐现在是有点子熟了哈哈哈,只要多敲多练肯定会有收获的!如果明天有时间的话,我会再把快速排序的思路图解编辑一下(饼先画上,最近过年走亲戚真的不想学习哈哈哈),今天还是把自己哄了一晚上才学习弄出来的这些笔记。给所有过年还在学习的同学们鼓掌(包括我自己哈哈哈),加油!!!

 图解安排上了,不算画饼了哈哈哈

  • 17
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值