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

详解快排的四种方式

快速排序是Hoare于1962年提出的⼀种⼆叉树结构的交换排序⽅法,其基本思想为:任取待排序元素 序列中的某元素作为基准值,按照该排序码将待排序集合分割成两⼦序列,左⼦序列中所有元素均⼩ 于基准值,右⼦序列中所有元素均⼤于基准值,然后最左右⼦序列重复该过程,直到所有元素都排列 在相应位置上为⽌。

1、lomuto前后指针法

void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}int _QuickSort(int* arr, int left, int right)
{int key = left, slow = left, fast = left + 1;while (fast <= right){if (arr[fast] < arr[key] && ++slow != fast){Swap(&arr[fast], &arr[slow]);}fast++;}Swap(&arr[key], &arr[slow]);return slow;
}void QuickSort(int* arr, int left, int right)
{if (left >= right){return;}int key = _QuickSort(arr, left, right );//左子序列QuickSort(arr,left,key-1);//右子序列QuickSort(arr,key+1,right);
}

2、hoare版本

1)创建左右指针,确定基准值

2)从右向左找出⽐基准值⼩的数据,从左向右找出⽐基准值⼤的数据,左右指针数据交换,进⼊下次 循环

int _QuickSort2(int* arr, int left, int right)
{int key = left;left++;while (left <= right){//left找比key大的值while (left <= right && arr[left] < arr[key]){++left;}//left指向比key大的值//right找比key小的值while (left <= right && arr[right] > arr[key]){--right;}if (left <= right){Swap(&arr[left++], &arr[right--]);}}Swap(&arr[key], &arr[right]);return right;
}

3、挖洞法

int _QuickSort3(int* arr, int left, int right)
{int key = arr[left];int hole = left;while (left < right){while (left < right && arr[right]>key){right--;}arr[hole] = arr[right];hole = right;while (left < right && arr[left] < key){left++;}arr[hole] = arr[left];hole = left;}arr[hole] = key;return hole;
}

4、非递归快排

void QuickSortNoR(int* arr, int left, int right)
{ST st;STInit(&st);//[left,right],进栈时要right先进left后进这样出栈的顺序才是对的STpush(&st, right);STpush(&st, left);while (!StackEmpty(&st)){//[begin,end]int begin = STtop(&st);STpop(&st);int end = STtop(&st);STpop(&st);int key = begin;int slow = begin;int fast = begin + 1;while (fast<=end){if (arr[fast] < arr[key] && ++slow != fast){Swap(&arr[fast], &arr[slow]);}fast++;}Swap(&arr[slow], &arr[key]);key = slow;//左 [begin,key-1]//右 [key+1,end]if (key + 1 < end){STpush(&st, end);STpush(&st, key + 1);}if (begin < key - 1){STpush(&st, key-1);STpush(&st, begin);}}}

http://www.xdnf.cn/news/956773.html

相关文章:

  • RT_Thread——线程管理(上)
  • 【系统架构设计师-2025上半年真题】案例分析-参考答案及部分详解(回忆版)
  • 【最新案例】智能物料称重柜/生鲜称重售卖柜系统, 共享自助管理系统, 物联网应用定制开发
  • 如何删除linux空的文件夹
  • 02__C++的基本语法
  • Unity中的Mathf.Lerp
  • ArcGIS Pro+ArcGIS给你的地图加上北回归线!
  • 安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
  • 什么是EULA和DPA
  • Android Test4 Application(Context)实例的获取
  • 深入探讨渗透测试的定义、关键步骤以及实施方法
  • 《射频识别(RFID)原理与应用》期末复习 RFID第三章 编码和调制(知识点总结+习题巩固)
  • EZDML:一款国产免费的数据库建模工具
  • [25-cv-61102]SMG律所代理Fanatics 体育用品商标维权案
  • UI学习(三)
  • 嵌入式学习Day34
  • VS Code中Augment AI免费额度用尽的完美解决方案
  • CppCon 2015 学习:The Birth of Study Group 14
  • Android15默认开启无障碍服务
  • ui框架-文件上传组件
  • 高密度ARM服务器的散热设计
  • JAVA开发工具箱
  • Easy Excel
  • Shell脚本 - 查看系统信息
  • 设计模式作业
  • Unity中的Time.fixedDeltaTime
  • 9. 线性表的顺序表示和实现(1)
  • TCP和UDP区别
  • 关于 WASM:1. WASM 基础原理
  • linux 下常用变更-8