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

算法程序设计-快速排序

快速排序采用---分治策略

L |------x-------------| R

第一步确定分界点:q[l],q[(l+r)/2],q[r]随机

第二步调整范围:L |--------<=x|>=x------------| R

第三步递归处理左右两端

两种做法:

第一种:暴力解决

另外定义两个数组a[],b[]

判断q中的数组元素与x进行比较,小于x的放进a,大于x的放进b

最后将a,b放进数组q中,可以实现,左边的均小于x,右面的均大于x。

时间复杂度为o(n),可以考虑

优雅的做法:

在头部和尾部分别定义两个指针,两个指针同时往中间走,

左面的指针先走,当左面指针对应的数据小于x时,继续往后走,当左面指针对应的数据大于x时,i就停下来,则去移动j指针,同理当j大于x时,指针向左移动,当j小于x时,指针停止。

当两个指针都停止时,进行swap交换,那么交换完,继续按照以上步骤执行直到i和j相遇,那么左面的数据均小于x,右面的数据均大于x。

边界问题背算法

#include<iostream>
using namespace std;const int N=1e6+10;
int n;
int q[N];void quick_sort(int q[],int l,int r){if(l>=r)return;int x=q[(l+r) / 2],i=l-1,j=r+1;while(i<j){do i++;while(q[i]<x);do j--;while(q[j]>x);if(i<j){swap(q[i],q[j]);}}quick_sort(q,l,j);quick_sort(q,j+1,r);}int main(){scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&q[i]);}quick_sort(q,0,n-1);for(int i=0;i<n;i++){printf("%d",&q[i]);}}

注意边界值要取中间值,边界值容易死循环

http://www.lryc.cn/news/344443.html

相关文章:

  • Jmeter用jdbc实现对数据库的操作
  • Mac 上安装多版本的 JDK 且实现 自由切换
  • springboot如何发送邮件,java如何发送邮件随机码作为验证
  • 使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析
  • 编译和链接(超详细)
  • Rust Turbofish 的由来
  • 2.外卖点餐系统(Java项目 springboot)
  • Universal Thresholdizer:将多种密码学原语门限化
  • 【UE5学习笔记】编辑及运行界面:关闭眼部识别(自动曝光)
  • 未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势
  • 3-qt综合实例-贪吃蛇的游戏程序
  • QGraphicsView实现简易地图12『平移与偏移』
  • 深入探索 Vue 中的 createVNode 与 resolveComponent
  • 【记录42】centos 7.6安装nginx教程详细教程
  • C语言程序设计(不熟悉的点)
  • DAO是什么?有什么用途?
  • Socket学习记录
  • 黑马 - websocket搭建在线聊天室
  • 【每日力扣】543. 二叉树的直径与101. 对称二叉树
  • 【linux】——日志分析
  • 【intro】GraphSAGE
  • 管理能力学习笔记九:授权的常见误区和如何有效授权
  • 第21天 反射
  • 多链路聚合设备是什么
  • 基于springboot+vue+Mysql的自习室预订系统
  • 解决后端ID传到前端时被截断,末尾显示00
  • Transformer中的数据输入构造
  • 完美实现vue3异步加载组件
  • 点云成图原理
  • 如何将jsp项目转成springboot项目