数据结构(8.3_2)——快速排序

server/2024/10/22 5:18:12/

算法思想:

设置两个指针,一个i指针初值为low和一个j指针初值为high,j指针从左往右移,当j指向的元素小于枢轴元素将该元素放到枢轴元素左边,i指针从右往左移,当i指向的元素大于枢轴元素,将该元素放到枢轴元素右边 

 

从上图可知49已经排序完,并且将左右两边分为了两个子表,接下来再对两个子表进行快速排序 

左子表:

 

右子表:

接下来的步骤继续将76划分为左右两个子表,继续进行快速排序

代码实现(重点) 

//用第一个元素将待排序序列划分成左右两个部分
int Partition(int A[], int low, int high) {int pivot = A[low];//第一个元素作为枢轴while (low < high) {//用low、high搜索枢轴的最终位置while (low < high && A[high] >= pivot)--high;A[low] = A[high];//比枢轴小的元素移动到左端while (low < high && A[low] <= pivot)++low;A[high] = A[low];//比枢轴大的元素移动到右端}A[low] = pivot;//枢轴元素存放到最终位置return low;//返回存放枢轴的最终位置
}//快速排序
void QuickSort(int A[], int low, int high) {if (low < high) {//递归跳出的条件int pivotpos = Partition(A, low, high);//划分QuickSort(A, low, pivotpos - 1);//划分左子表QuickSort(A, pivotpos + 1, high);//划分右子表}
}

代码解释:

首先需要一个递归调用栈

 

进入第一层的QuickSort函数,传入数据和划分左右子表,low=0,high=7,#96表示代码执行的行数是在第96行:

第一层划分结果,传出low的值是3,第一层的pivotpos=3;

 

接下来划分左子表,进入第二层的QuickSort函数,low=0,high=pivotpos-1,此时第一层还压在栈中

划分完后第二层pivotpos=1,接下来开始划分左子表的左子表,进入第三层QuickSort函数,low=0,high=pivotpos-1;

 

 

 

划分完左子表的左子表后,因为第三层的low=high,所以退回第二层,接下来进行第二层的划分右子表,进入第三层QuickSort,low=pivotpos+1,high=2;

因为low=high,所以无需处理数据,直接返回第二层QuickSort函数

接下来返回第一层QuickSort函数,开始运行划分右子表代码,进入第二层QuickSort函数,low=4,high=7;

在第二层中处理完后返回low值为6,得到第二层的pivotpos=6,开始进行第二层划分左子表,low=4,high=5

在第三层中调用QuickSort函数,进入第四层,得出第三层pivotpos=4,同时因为low=high退出第四层,返回第三层;

在第三层开始执行划分左子表操作,low=4,high=pivotpos-1,进入第四层QuickSort

因为low>high,所以返回第三层,开始执行划分右子表操作,low=pivotpos+1,high=5

因为low=high,所以返回第三层,因为第三层代码执行完毕,返回第二层,开始执行划分右子表操作,low=pivotpos+1,high=7

因为low=high,所以返回第二层,又因为第二层代码执行完毕,所以返回第一层,第一层代码也已经执行完毕,递归结束;

算法效率分析

时间复杂度=O(n*递归层数)

Partition函数时间复杂度:O(n)

 

 

空间复杂度=O(递归层数) 

平均时间复杂度:O(nlog_2n) 

比较好的情况:

 

最坏的情况:

 

优化思路:

 

 

 

递归层数(转换为二叉树的高度进行判断) 

快速排序算法的稳定性:

不稳定

 

 

总结:

 


http://www.ppmy.cn/server/133800.html

相关文章

麒麟操作系统服务器kylin-kms-activation反复启动失败问题排查

问题现象: messages日志中,kylin-kms-activation.service服务异常结束,返回码为255。并且一直在循环启动服务,循环打印错误日志。 Sep 13 17:06:59 server-sp3 systemd[1]: kylin-kms-activation.service: Main process exited, code=exited, status=255/EXCEPTION Sep 13 …

软件测试快速入门:测试对象、过程模型、生命周期与测试用例

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

特斯拉自动驾驶出租车计划变成泡影?联想与Meta合作,推出面向PC的个人AI智能体AI Now|AI日报

文章推荐 Swarms Corporation创始人Kye Gomez实锤OpenAI多智能体Swarm抄袭其成果&#xff01;&#xff5c;AI日报 今日热点 中国海油“海能”人工智能模型正式发布 近日&#xff0c;由中国海油与中国电信、科大讯飞等企业合作打造“海能”人工智能模型正式推出。 中国海油“…

【付费】Ambari集成Dolphin实战-002-bigtop下编译dolphin——下

3.2 编译过程记录 3.2.1 do-component-build 执行 17:28:50.944 [ERROR] [system.err] + STATUS=0 17:28:50.944 [ERROR] [system

基于深度学习的基于视觉的机器人导航

基于深度学习的视觉机器人导航是一种通过深度学习算法结合视觉感知系统&#xff08;如摄像头、LiDAR等&#xff09;实现机器人在复杂环境中的自主导航的技术。这种方法使机器人能够像人类一样使用视觉信息感知环境、规划路径&#xff0c;并避开障碍物。与传统的导航方法相比&am…

MATLAB基础应用精讲-【数模应用】负二项回归(附R语言和python代码实现)

目录 前言 几个高频面试题目 负二项回归、Probit回归如何选择 负二项回归 Probit回归 知识储备 逻辑回归 算法原理 多阈值负二项回归模型 模型及估计方法 负二项回归模型 多阈值负二项回归模型 分割阶段 精确估计阈值阶段 ​‌负二项回归的操作步骤 负二项回归…

微信小程序设计尺寸

微信小程序的设计尺寸规范主要基于‌rpx单位&#xff0c;规定屏幕宽度为750rpx。‌ 在设计微信小程序时&#xff0c;设计师通常以‌iPhone 6的屏幕尺寸&#xff08;375px&#xff09;作为基准&#xff0c;因为1rpx等于0.5px&#xff0c;即1rpx等于1物理像素。这意味着在设计稿上…

【含文档】基于Springboot+Vue的出租车管理系统的设计与实现(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…