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

快速排序法

由于冒泡排序法的时间复杂程度较高,为了提高排序效率,人们改进了冒泡排序,从而得到了快速排序法.快速排序法的核心思想是:经过一趟比较后,确定某个元素在排序后的最终位置.

假设有一个含n个元素的待排序集合A={a1,a2...an},选取a1作为基准元素,采用快速排序法一趟排序的过程如下:

1.设置两个变量i,j作为指针,排序之初,i=0,j=n-1

2.以第一个元素作为基准元素,保存为变量key,key=a1

3.从后向前搜索,即从j开始向前,如果A[j]>key,则j--,直到找到第一个比key小的元素,交换A[i]与A[j]

4.从前向后搜素,即从i开始向后,如果A[i]>key,则i++,直到找到一个比key大的元素,交换A[i]与A[j]

5.反复执行步骤3,4,直到i=j,停止循环,完成一趟排序,i位置就是基准元素最终的落脚位置.i位置的左侧元素都比key小,i的右侧都比key大,最总key将处于集合中的最终位置.

然后对左侧子集合和右侧子集合继续套用上述排序过程,直到每个子集合只含有一个元素为止,至此排序完毕.

用python实现快速排序法,定义名为Quicksort的快速排序函数,变量如下:

1.num变量:表示排序数组名,为list类型

2.low变量:表示次趟排序的首位元素位置,为int类型

3.high变量:表示此趟排序的末位元素的位置,为int类型

4.i变量:表示此趟排序的左指针,为int类型

5.j变量:表示此趟排序的右指针,为int类型

6.key变量:保存基准元素的值,为list类型

函数定义如下:

def Quicksort(nums, low, high):
    if low < high:
        i = low
        j = high
        key = nums[i]
        
        while i < j:
            # 从右向左找第一个小于基准元素的元素
            while i < j and key <= nums[j]:
                j -= 1
            if i < j:
                nums[i] = nums[j]
            
            # 从左向右找第一个大于基准元素的元素
            while i < j and key >= nums[i]:
                i += 1
            if i < j:
                nums[j] = nums[i]
        
        # 将基准元素放到它最终的位置
        nums[i] = key
        
        # 递归对基准元素左边的子数组进行快速排序
        Quicksort(nums, low, i - 1)
        
        # 递归对基准元素右边的子数组进行快速排序
        Quicksort(nums, i + 1, high)

测试

nums = [3, 5, 2, 4, 1]
Quicksort(nums, 0, len(nums) - 1)
print(nums)  # 输出排序后的数组

输出

[1, 2, 3, 4, 5]


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

相关文章:

  • Python 连接 Redis 进行增删改查(CRUD)操作
  • 微服务(二)
  • Spring框架之观察者模式 (Observer Pattern)
  • 系统架构设计师论文
  • 设计模式-七个基本原则之一-迪米特法则 + 案例
  • 【LeetCode】【算法】55. 跳跃游戏
  • Macos mysql实现命令自动补全的方法
  • 7天用Go从零实现分布式缓存GeeCache(总结)
  • 目录树文件名映射深度1分组计数,tree(映射(目录A))
  • Mysql用户权限与账号管理
  • Conda环境、Ubuntu环境移植
  • Scala 的List
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-成绩排序ABCDE
  • 3DTiles之使用customShader调整风格
  • 图像处理实验一(Matlab Exercises and Image Fundamentals)
  • Unity使用PS合并贴图
  • 「IDE」PyCharm 之 安装与卸载
  • Python 数据库操作教程
  • python购物计算 2024年6月青少年电子学会等级考试 中小学生python编程等级考试一级真题答案解析
  • 51c自动驾驶~合集21
  • python,dataclasses模块介绍及示例
  • 基于MATLAB的图像处理字母识别
  • MySQL初学之旅(2)增删改查—上
  • java 读取log日志文件关键信息
  • BeanUtils.copyProperties,拷贝后,修改target对象的字段,如果保证source对象字段不会变化
  • 2024年9月 GESP CCF C++六级编程能力等级考试认证真题