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

交换排序——快速排序

        交换排序的基本思路:把序列中的两个元素进行比较,根据需求对两个元素进行交换。特点是较大的元素向序列的尾部移动,较小的元素向序列的前部移动。

        hoare法

        在序列中任取一个元素作为基准值,一趟排序完成之后,以基准值为分割点,左边的元素都小于基准值,右边的元素都大于基准值。

        一般选最左边的值作为基准值。定义左右两个指针,left和right。right找小于基准元素的值,left找大于基准值的元素。找到之后,把left和right的值交换,就是把小的元素往前换,大的元素往后换。注意,基准值在左边,一定让右边先走。如果基准值在右边,一定让左边先走。

           

         最后把keyi和相遇点的下标交换一下。以该keyi为界,左边的值都小于基准值,右边的值都大于基准值。之后对函数递归调用就好了。

        现在有两个问题:

        1、为什么基准值在左边,一定让右边先走?

      

        如果左边先走,left和right相遇时,不能保证相遇点的值比基准值小。

        2、为什么基准值在左边,一定让右边先走,最后相遇点的值一定比基准值小?

        相遇有两种情况。(1)在一次完成交换后,right找小,一直找到与left相遇。而这时left所指向的值是和原来的right交换来的,该值一定比基准值小。(2)right找到小,left找大一直找到与right相遇,该值也比基准值要小。

//交换两个值
void Swap(int* p, int* q)
{int tmp = *p;*p = *q;*q = tmp;
}
//hoare法
int PartSort1(int* a, int left, int right)
{int keyi = left;//一般选第一个为基准值while (left < right){//这里也要控制left<right,有可能序列已经有序,right会一直减到小于0,造成越界访问//right找小while (left < right && a[right] >= a[keyi]){right--;}//left找大while (left < right && a[left] <= a[keyi]){left++;}Swap(&a[left], &a[right]);//交换left和right最终指向的值}Swap(&a[keyi], &a[left]);//交换基准值和相遇点的值Swap(&keyi, &left);return keyi;
}void QuickSort(int* a, int left, int right)
{if (left >= right)//区间只有一个值或者区间不存在,直接返回{return;}int begin = left;//记录区间第一个元素的下标int end = right;//记录区间最后一个元素的下标int keyi = PartSort1(a, left, right);//一趟排序//序列被划分为三个部分//[begin,keyi-1] keyi [keyi+1,end]QuickSort(a, begin, keyi - 1);//对左区间排序QuickSort(a, keyi + 1, end);//对右区间排序
}

文章转载自:
http://cassareep.wanhuigw.com
http://alligator.wanhuigw.com
http://cavity.wanhuigw.com
http://bobwig.wanhuigw.com
http://autophagy.wanhuigw.com
http://antilogarithm.wanhuigw.com
http://baptize.wanhuigw.com
http://autumn.wanhuigw.com
http://cancerroot.wanhuigw.com
http://beaten.wanhuigw.com
http://aestivate.wanhuigw.com
http://brinell.wanhuigw.com
http://bike.wanhuigw.com
http://belled.wanhuigw.com
http://campestral.wanhuigw.com
http://cha.wanhuigw.com
http://bandage.wanhuigw.com
http://caner.wanhuigw.com
http://banking.wanhuigw.com
http://beatitude.wanhuigw.com
http://centipede.wanhuigw.com
http://cavitate.wanhuigw.com
http://argonautic.wanhuigw.com
http://chemiluminescnet.wanhuigw.com
http://allometric.wanhuigw.com
http://abscessed.wanhuigw.com
http://arcograph.wanhuigw.com
http://aardwolf.wanhuigw.com
http://apogamic.wanhuigw.com
http://chamade.wanhuigw.com
http://www.dtcms.com/a/143659.html

相关文章:

  • opencv 图像的旋转
  • mysql的函数(第一期)
  • 简单线段树的讲解(一点点的心得体会)
  • 动态规划算法:状态压缩
  • 【python编程从入门到到实践】第二章 变量和简单的数据类型
  • Nginx 文件上传大小限制及 `client_max_body_size` 最大值详解
  • Linux 系统盘制作 | 引导加载器(GRUB 为例)| mount
  • 二叉树进阶 - 二叉搜索树
  • PDF转excel+json ,vue3+SpringBoot在线演示+附带源码
  • 宇树机器狗go2—slam建图(1)点云格式
  • MLLMs for TSAD ?
  • 单例模式:懒汉式的两种优化写法
  • 编译报错 宏 _IOC_SIZEBITS,而这个宏在编译时未定义
  • Bash 中的数学运算详解
  • 【每天一个知识点】模式识别
  • 自动驾驶---决策规划之导航增强端到端
  • Jinja2模板引擎SSTI漏洞
  • 加密壳(二)将shellcode写入PE
  • STL——红黑树的封装及map/set的模拟实现
  • 数字孪生火星探测车,星际探索可视化
  • 泛目录二级目录【实用指南】,无极站群系统2025升级版
  • leetcode125.验证回文串
  • java蓝桥杯b组
  • 20-算法打卡-哈希表-赎金信-leetcode(383)-第二十天
  • 用sed替换文本 笔记250419
  • Linux 进程间通信详解
  • 鼠标移动操作
  • C++原码、反码和补码
  • YuE本地部署完整教程,可用于ai生成音乐,歌曲
  • 6. 话题通信 ---- 使用自定义msg,发布方和订阅方cpp,python文件编写