当前位置: 首页 > 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);}}}

相关文章:

  • 1.6 http模块nodejs 对比 go
  • CocosCreator 之 JavaScript/TypeScript和Java的相互交互
  • 篇章十 数据结构——排序
  • “冒个泡泡”,排个序呗~:C语言版冒泡排序全解
  • Linux命令cat /proc/net/snmp查看网络协议层面统计信息
  • 【春秋云镜】CVE-2023-2130漏洞复现exp
  • 如何把工业通信协议转换成http websocket
  • UFW防火墙安全指南
  • 《C++初阶之入门基础》【普通引用 + 常量引用 + 内联函数 + nullptr】
  • Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
  • 在Zenodo下载文件 用到googlecolab googledrive
  • Excel 怎么让透视表以正常Excel表格形式显示
  • WebRTC(一):整体架构
  • 基于深度学习的图像分割技术:原理、应用与实践
  • ES6(ES2015)特性全解析
  • Shell 解释器​​ bash 和 dash 区别
  • laravel8+vue3.0+element-plus搭建方法
  • composer init
  • 香港虚拟主机安装WordPress
  • Maotu流程图编辑器:Vue3项目中的集成实战与自定义流程开发指南
  • 做一个网站需要哪些资源/拼多多搜索关键词排名
  • ubuntu做网站开发/白度
  • 做网站怎么备份数据/外链发布平台大全
  • 骏域网站建设专家广州/网络搭建是干什么的
  • 邮箱wordpress/临沂seo建站
  • 清河网站建设/百度联系电话多少