当前位置: 首页 > article >正文

算法---快速排序

快速排序的步骤

  1. 在要排序的数组中找一个基准值
  2. 把小于基准值的数据集中到数组的左边(升序),把大于基准值的数据集中到数组的右边
  3. 数组的左边和右边重复上边的步骤,直到数组有序

代码(递归)

class Solution:


    def quick_sort(self, arr):
        n = len(arr)
        # 使用递归方法,下面是递归的结束条件
        if n <= 1:
            return arr
        # 一般以数组中间的元素为基准值
        mid_index = n // 2
        mid_val = arr[mid_index]
        left = []
        right = []
        for i in range(n):
            # 如果i为基准索引,则跳过操作
            if i == mid_index:
                continue
            # 把小于基准值的数据放在左数组中
            if arr[i] < mid_val:
                left.append(arr[i])
            else:
                # 把大于基准值的数据放在右数组中
                right.append(arr[i])
        # 将左数组,基准值和右数组整合在一起
        return self.quick_sort(left) + [mid_val] + self.quick_sort(right)


if __name__ == "__main__":
    arr = [8, 0, 4, 6, 1, 2, 7, 3, 5, 9]
    s = Solution()
    res = s.quick_sort(arr)
    print(res)

我们知道递归法一般是用空间换去时间,会加重内存的负担,因此我们可以使用时间换空间的方法。那就是使用双指针

代码(双指针)

import random
class Solution:
    def sort_once(self, arr, left, right):
        # 获取基准值
        pivot_index = random.randint(left, right)
        arr[pivot_index], arr[right] = arr[right], arr[pivot_index]
        pivot = arr[right]
        i = left - 1
        for j in range(left, right):
            if arr[j] < pivot:
                i += 1
                arr[i], arr[j] = arr[j], arr[i]
        arr[i + 1], arr[right] = arr[right], arr[i + 1]
        return i + 1

    def quick_sort(self, arr, left, right):
        if left < right:
            index = self.sort_once(arr, left, right)
            self.quick_sort(arr, left, index - 1)
            self.quick_sort(arr, index + 1, right)


if __name__ == "__main__":
    arr = [8, 0, 4, 6, 1, 2, 7, 3, 5, 9]
    s = Solution()
    s.quick_sort(arr, 0, len(arr) - 1)
    print(arr)


http://www.kler.cn/a/526724.html

相关文章:

  • Python3 【集合】避坑指南:常见错误解析
  • 【解决方案】MuMu模拟器移植系统进度条卡住98%无法打开
  • 快速提升网站收录:避免常见SEO误区
  • 深入解析JPA实体监听器的使用与实践
  • AI学习指南HuggingFace篇-Hugging Face 的环境搭建
  • 自由学习记录(33)
  • INCOSE需求编写指南-附录 B: 首字母缩略词和缩写
  • 详解python的单例模式
  • DeepSeek-V3技术报告解读
  • Cocos Creator 3.8 2D 游戏开发知识点整理
  • Sqoop支持ORC文件格式
  • AI大模型开发原理篇-4:神经概率语言模型NPLM
  • 【C++题解】1055. 求满足条件的整数个数
  • GWO优化GRNN回归预测matlab
  • 165. 比较版本号
  • 《解码AI大模型涌现能力:从量变到质变的智能跃迁》
  • 如何利用Docker和.NET Core实现环境一致性、简化依赖管理、快速部署与扩展,同时提高资源利用率、确保安全性和生态系统支持
  • Deepseek r1模型对医疗大模型的发展有什么影响?
  • 线程池以及在QT中的接口使用
  • Carla-ModuleNotFoundError: No module named ‘agents.navigation‘