【算法】快速排序的基本思想、优化 | 挖坑填补法和区间分割法

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 一、挖坑填补法
  • 二、区间分割法
  • 三、快排的优化:

快排的基本思想:先确定一个标准值,将比标准值小的元素放在标准值的左侧,比标准值大的元素放在右侧,左右部分分别重复以上的操作,直到整个数组有序。

快速排序是基于分治策略的排序算法

一、挖坑填补法

  1. 选择一个基准元素
  2. 将基准元素挖出,形成一个坑
  3. 从右向左遍历数组,找到第一个比基准元素小的元素,将其填入空坑中,并将此位置视为新的坑
  4. 从左向右遍历数组,找到第一个比基准元素大的元素,将其填入新的空坑中,并将此位置视为新的坑
  5. 重复过程,直到左右指针相遇
  6. 最后将基准元素填入坑中,此时基准元素左边的所有元素都比它小,右边的所有元素都比它大。
  7. 对基准元素左边右边的子数组递归地进行上述操作,直到整个数组有序

image.png

C++代码:

#include <iostream>
#include <cmath>
using namespace std;int partition(int arr[], int left, int right)
{// 确定标准值,保存起来int standard = arr[left];//使用双指针从两端开始,将比标准值大的数放到标准值右侧,小于标准值的放到左侧while (left < right){//从右到左(right到left)找到比标准值小的//如果遇到的值大于等于标准值,则跳过 right--while (left < right && arr[right] >= standard){right--;}//找到了比标准值小的值arr[right],放到左边的left坑中arr[left] = arr[right];//从左到右(left到right)找到比标准值大的//如果遇到的值小于等于标准值,则跳过 left++while (left < right && arr[left] <= standard){left++;}//找到了比标准值大的值arr[left],放到左边的right坑中arr[right] = arr[left];}//中间的坑放入标准值arr[left] = standard;//返回标准值的下标return left;
}void quicksort(int arr[], int left, int right)
{if (arr == NULL || left >= right) return;int standard = partition(arr, left, right);quicksort(arr, left, standard - 1);quicksort(arr, standard + 1, right);
}void print(int arr[], int len)
{if (arr == NULL || len <= 0) return;for (int i = 0; i < len; i++){std::cout << arr[i] << " ";}std::cout << endl;
}int main()
{int arr[] = { 5, 1, 7, 0, 4, 3, 4, 9, 6 };int len = sizeof(arr) / sizeof(arr[0]);cout << "------------------------------" << endl << "原始序列:";print(arr, len);quicksort(arr, 0, len - 1);cout << "------------------------------" << endl << "排序后序列:";print(arr, len);return 0;
}

image.png

二、区间分割法

#include <iostream>
#include <cmath>
using namespace std;int partition(int arr[], int left, int right)
{int nSmall = left - 1;for (left; left < right; left++){if (arr[left] < arr[right]){//小区间扩张if (++nSmall != left){arr[nSmall] = arr[nSmall] ^ arr[left];arr[left] = arr[nSmall] ^ arr[left];arr[nSmall] = arr[nSmall] ^ arr[left];}}}//将标准值放入if (++nSmall != right){arr[nSmall] = arr[nSmall] ^ arr[right];arr[right] = arr[nSmall] ^ arr[right];arr[nSmall] = arr[nSmall] ^ arr[right];}return nSmall;
}
void print(int arr[], int len)
{if (arr == NULL || len <= 0) return;for (int i = 0; i < len; i++){std::cout << arr[i] << " ";}std::cout << endl;
}int main()
{int arr[] = { 5, 1, 7, 0, 4, 3, 4, 9, 6 };int len = sizeof(arr) / sizeof(arr[0]);cout << "------------------------------" << endl << "原始序列:";print(arr, len);quicksort(arr, 0, len - 1);cout << "------------------------------" << endl << "排序后序列:";print(arr, len);return 0;
}

三、快排的优化:

  • 1.标准值的选取:选取三个数字(头、尾、中间),选择大小为中间值
  • 2.分割到数据较少时,不再使用快排,使用插入排序
  • 3.使用栈取代递归
  • 4.尾递归

以下为使用了标准值三选一、按情况使用插入排序的优化后代码:

class Solution {
public:void swap (vector<int>& nums, int i, int j) {     int temp = nums[i];nums[i] = nums[j];nums[j] = temp;} void insertSort (vector<int>& nums, int left, int right) {for (int i = left+1; i <= right; i++) {int temp = nums[i];int j = i-1;for (j = i-1; j >= 0; j--) {if (temp < nums[j]) {nums[j+1] = nums[j];continue;} break;}nums[j+1] = temp;}} int place(vector<int>& nums,int left,int right){//标准值三选一int mid = left + (right-left)/2;if (nums[left] > nums[right]) swap(nums,left,right);if (nums[mid] > nums[right]) swap(nums,mid,right);if (nums[mid] > nums[left]) swap(nums,mid,left); int standard = nums[left];while(left < right){while(left<right&&nums[right]>standard){right--;}nums[left] = nums[right];while(left<right&&nums[left]<standard){left++;}nums[right] = nums[left];}nums[left] = standard;return left;}void quickSort(vector<int>& nums,int left,int right){//分割到数据较少时,不再使用快排,使用插入排序if (right - left <= 5) {insertSort(nums,left,right);return;}     if(nums.size() == 0 || left >= right) return;int standard = place(nums,left,right);quickSort(nums,left,standard-1);quickSort(nums,standard+1,right);}vector<int> sortArray(vector<int>& nums) {quickSort(nums,0,nums.size()-1);return nums;}
};

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/818937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue实现的疫情防控物资调配与管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

家居网购项目(权限验证+事务管理)

文章目录 1.过滤器权限认证1.程序框架图2.web.xml3.编写AdminAuthorization4.编写MemberAuthorization5.细节6.结果展示1.未登录可以任意浏览商品2.点击添加购物车提示登录3.点击后台管理&#xff0c;提示管理员登录4.也做了其余资源的访问验证 2.事务管理1.思路分析2.重写JDBC…

程序猿之路

我接触计算机算对自己来说是比较晚的了&#xff0c;上初中的时候就有微机课&#xff0c;但是在那个小县城&#xff0c;上课也只是3个人共用一个电脑&#xff0c;我初中整个过程只会开关机&#xff0c;哈哈&#xff0c;虽然学过word&#xff0c;但是无奈&#xff0c;我插不上手呀…

开源相机管理库Aravis例程学习(三)——注册回调multiple-acquisition-callback

开源相机管理库Aravis例程学习&#xff08;三&#xff09;——回调multiple-acquisition-callback 简介例程代码arv_camera_create_streamArvStreamCallbackTypeArvStreamCallback 简介 本文针对官方例程中的&#xff1a;02-multiple-acquisition-callback做简单的讲解。 ara…

C语言 | Leetcode C语言题解之第30题串联所有单词的子串

题目&#xff1a; 题解&#xff1a; typedef struct {char key[32];int val;UT_hash_handle hh; } HashItem;int* findSubstring(char * s, char ** words, int wordsSize, int* returnSize){ int m wordsSize, n strlen(words[0]), ls strlen(s);int *res (int *)mall…

【opencv】示例-videocapture_starter.cpp 从视频文件、图像序列或连接到计算机的摄像头中捕获帧...

/** * file videocapture_starter.cpp * brief 一个使用OpenCV的VideoCapture与捕获设备&#xff0c;视频文件或图像序列的入门示例 * 就像CV_PI一样简单&#xff0c;对吧&#xff1f; * * 创建于: 2010年11月23日 * 作者: Ethan Rublee * * 修改于: 2013年4月17日 * …

金蝶云星空与领星ERP对接集成分布式调入单查询打通添加/编辑本地产品

金蝶云星空与领星ERP对接集成分布式调入单查询打通添加/编辑本地产品 接通系统&#xff1a;金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的…

Unity 扩展自定义编辑器窗口

在Assets文件夹路径下任意位置创建Editor文件夹&#xff0c;将扩展编辑器的代码放在Editor文件夹下 生成编辑器窗口 代码中首先引用命名空间 using UnityEditor; 然后将创建的类继承自EditorWindow public class MenuEditor : EditorWindow 然后通过扩展编辑器菜单功能调用…

51-40 Align your Latents,基于LDM的高分辨率视频生成

由于数据工程、仿真测试工程&#xff0c;咱们不得不进入AIGC图片视频生成领域。兜兜转转&#xff0c;这一篇与智驾场景特别密切。23年4月&#xff0c;英伟达Nvidia联合几所大学发布了带文本条件融合、时空注意力的Video Latent Diffusion Models。提出一种基于LDM的高分辨率视…

MySQL8.0.36-社区版:通用语法(2)

语法格式规范 sql语句可以以单号或者多行为书写&#xff0c;以分号结尾 可以使用空格或者缩进来增加可读性 mysql的sql语句不区分大小写&#xff0c;但是推荐大写关键字 注释分为单号注释和多行 单号注释&#xff1a;--内容 或者 # 内容 多行注释/* 注释内容 */ sql语句的…

面试算法-175-将有序数组转换为二叉搜索树

题目 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树。 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#xff1a;[0,-10,5,null,-3,null,9] 也将被视…

数据结构 -- 数组

本篇文章主要是对数组的实操&#xff0c;所以对数组的概念不在赘述&#xff0c;了解更多数组相关可参照链接 Java数组的概念及使用-CSDN博客 1、DynamicArray类 package com.hh.algorithm.array;import java.util.Arrays; import java.util.Iterator; import java.util.functi…

记录--病理切片图像处理

简介 数字病理切片&#xff0c;也称为全幻灯片成像&#xff08;Whole Slide Imaging&#xff0c;WSI&#xff09;或数字切片扫描&#xff0c;是将传统的玻片病理切片通过高分辨率扫描仪转换为数字图像的技术。这种技术对病理学领域具有革命性的意义&#xff0c;因为它允许病理…

每日OJ题_BFS解决最短路③_力扣127. 单词接龙

目录 ③力扣127. 单词接龙 解析代码 ③力扣127. 单词接龙 127. 单词接龙 难度 困难 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。…

互联网元搜索引擎SearXNG

最近有个很火的项目叫 FreeAskInternet&#xff0c;其工作原理是&#xff1a; 第一步、用户提出问题第二步、用 SearXNG&#xff08;本地运行&#xff09;在多个搜索引擎上进行搜索第三步、将搜索结果传入 LLM 生成答案 所有进程都在本地运行&#xff0c;适用于需要快速获取信…

Python数据分析与应用 |第4章 使用pandas进行数据预处理 (实训)

表1-1healthcare-dataset-stroke.xlsx 部分中风患者的基础信息和体检数据 编号性别高血压是否结婚工作类型居住类型体重指数吸烟史中风9046男否是私人城市36.6以前吸烟是51676女否是私营企业农村N/A从不吸烟是31112男否是私人农村32.5从不吸烟是60182女否是私人城市34.4抽烟是…

【LAMMPS学习】八、基础知识(3.2)使用chunks计算系统属性

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

蓝桥杯 — —灵能传输

灵能传输 友情链接&#xff1a;灵能传输 题目&#xff1a; 输入样例&#xff1a; 3 3 5 -2 3 4 0 0 0 0 3 1 2 3输出样例&#xff1a; 3 0 3思路&#xff1a; 题目大意&#xff1a;给出一个数组&#xff0c;每次选择数组中的一个数&#xff08;要求不能是第一个数与最后一个…

大数据几种任务调度工具

文章目录 一、DolphinScheduler概述和部署1、DolphinScheduler简介1.1 概述1.2 核心架构 2、DolphinScheduler部署模式2.1 概述2.2 单机模式2.3 伪集群模式2.4 集群模式 3、DolphinScheduler集群模式部署3.1 集群规划与准备3.2 下载与配置部署脚本3.3 初始化数据库3.4 一键部署…

maven引入外部jar包

将jar包放入文件夹lib包中 pom文件 <dependency><groupId>com.jyx</groupId><artifactId>Spring-xxl</artifactId><version>1.0-SNAPSHOT</version><scope>system</scope><systemPath>${project.basedir}/lib/Spr…