快速排序模拟实现

快速排序,时间复杂度为O(NlogN),属于排序中相对快的那一列,以下是快排的模拟实现:

法一:左右指针交换法

void swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}//交换函数int getmid(int* a, int left, int right)
{   int mid = (left + right) / 2;if (a[left] < a[right]){if (a[mid] > a[right]){return right;}else{if (a[mid] > a[left]){return mid;}else{return left;}}}else  //left大于right{if (a[mid] < a[right]){return right;}else{if (a[mid] < a[left]){return mid;}else{return left;}}}}//三数取中int PartSort1(int* a, int left, int right)
{int mid = getmid(a, left, right);int keyi = left;while (left < right){while (left < right && a[right]>=a[keyi]){right--;}while (left < right && a[left] <=a[keyi]){left++;}swap(&a[left], &a[right]);}swap(&a[keyi], &a[left]);return left;}void sort(int* arr, int left, int right)
{if (left < right){int mid = PartSort1(arr, left, right);sort(arr, left, mid - 1);sort(arr, mid + 1, right);}}

本思路是以left下标所指的元素为分界线,left指针向右移动找比分界元素大的,right指针向左移动找比分解元素小的,然后两者交换。通过这样循环,使得左侧的元素都是比分界元素小的,右侧元素都是比分界元素大的,且此时分界元素已经放在了排好序后的正确位置上。再对分界元素左侧、右侧调用同样的方法,最后就能实现排序。三数取中是一种优化方式,使得left下标所指向的元素更加贴近当前left到righ范围内的中间值。最后之所以用left指向位置和keyi指向位置进行交换,是因为left此时所指元素一定小于等于keyi所指向的元素。下面会证明为什么left此时所指元素一定小于等于keyi所指向的元素:

当循环停止以后,循环前的最后一次移动分两种情况,一种是right指针左移动碰到left,一种是left指针右移动碰到right。对于第一种情况,此时left指针所指的位置是前面left和right所指元素交换后的,所以此时left所指元素一定是小于keyi的。对于第二种情况,此时right指针已经结束移动,所指向的位置也是小于keyi的元素。所以left此时所指元素一定小于等于keyi所指向的元素。当然,如果先移动left指针再移动right指针,就不能符合上述结论。

法二:挖坑法

// 挖坑法
int PartSort2(int* a, int left, int right)
{int mid = getmid(a, left, right);swap(&a[left], &a[mid]);//三数取中int key = a[left];int hole = left;while (left < right){while (left < right && a[right] >= key){right--;}a[hole] = a[right];hole = right;while (left < right && a[left] <= key){left++;}a[hole] = a[left];hole = left;}a[hole] = key;return hole;}void sort(int* arr, int left, int right)
{if (left < right){int mid = PartSort2(arr, left, right);sort(arr, left, mid - 1);sort(arr, mid + 1, right);}}

该方法的思路是先把left所指的位置视为坑,保存最左的元素到可以中 ,此后利用right指针和left指针移动找元素填坑和创建新坑。此时整个数组中一直保持着有一个下标指向坑,最后再将最开始保存的key放入坑中,形成完整的数组。left和right指针的移动规则仍然是left找比key大的,right找比key小的。

法三:前后指针法

int PartSort3(int* a, int left, int right)
{int prev = left;int cur = left+1;while (cur <= right){while(cur <= right&&a[cur] <= a[left]){  prev++;swap(&a[cur], &a[prev]);cur++;}if (cur > right){break;}while (cur <= right && a[cur] > a[left]){cur++;}if (cur > right){break;}}swap(&a[prev], &a[left]);return prev;
}void sort(int* arr, int left, int right)
{if (left < right){int mid = PartSort2(arr, left, right);sort(arr, left, mid - 1);sort(arr, mid + 1, right);}}

思路是让prev的下一位元素是比a[left]大的元素,cur所指的元素是比a[left]小的元素,然后交换,使得小于a[left]的元素往左移动,比a[left]大的元素不断往右移动。

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

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

相关文章

Python实现MYSQL蜜罐

1 LOAD DATA INFILE介绍 首先开启一个Mysql&#xff0c;看一下mysql是如何读取主机文件的。 1.1 linux搭建mysql 1&#xff09;docker运行mysql 2&#xff09;启动Mysql docker run -itd…

【GO】网络请求例子

post请求;multipart/form-data类型 // 构建请求参数requestData : map[string]interface{}{"gb": "","code": "","reMemberInfo": map[string]interface{}{"shi": "","…

【开发工具】idea 的全局搜索快捷键(Ctrl+shift+F)失效

文章目录 前言1. 取消 输入法的快捷键&#xff08;推荐使用&#xff09;2.更改 idea的快捷键3. 热键占用总结 前言 当你发现在idea 中看到用于全局搜索的快捷键就是 CtrlshiftF&#xff0c;可是怎么按都不管用的时候&#xff0c;你就不要再执着于自己的操作继续狂点电脑按键了…

Lnmp架构之mysql数据库实战1

1、mysql数据库编译 编译成功 2、mysql数据库初始化 配置数据目录 全局文件修改内容 生成初始化密码并进行初始化设定 3、mysql主从复制 什么是mysql的主从复制&#xff1f; MySQL的主从复制是一种常见的数据库复制技术&#xff0c;用于将一个数据库服务器&#xff08;称为主…

python3读写dbf文件

目录 1 读dbf文件2 写dbf文件 1 读dbf文件 import dbf# 打开dbf文件 table dbf.Table(阿坝藏族羌族自治州_BXF_CHA.dbf)# 打开文件并进行读写操作 table.open(modedbf.READ_WRITE)# 遍历记录并更新字段值 res [] with table:for record in table:res.append(list(record))# …

解决Permission is not allowed后基于Ubuntu23.04安装配置docker与docker-compose

参考&#xff1a;Docker官网-Install Docker Engine on Ubuntu 虚拟机里安装ubuntu-23.04-beta-desktop-amd64&#xff0c;开启SSH(换源、备份)&#xff0c;配置中文以及中文输入法等 基于CentOS7安装配置docker与docker-compose 一、 Install using the Apt repository 1.…

线性代数的本质(七)——特征值和特征向量

特征值和特征向量 本章特征值和特征向量的概念只在方阵的范畴内探讨。 相似矩阵 Grant&#xff1a;线性变换对应的矩阵依赖于所选择的基。 一般情况下&#xff0c;同一个线性变换在不同基下的矩阵不同。仍然以平面线性变换为例&#xff0c;Grant 选用标准坐标系下的基向量 i…

conda环境下XZ_5.1.2alpha not found解决方案

1 问题描述 yum install cmake 使用yum安装cmake失败&#xff0c;失败信息如下&#xff1a; [rootlocalhost]# yum install cmake There was a problem importing one of the Python modules required to run yum. The error leading to this problem was:/root/anaconda3/li…

blog--4美化主题

配置/美化 bug 把你的网站名/themes/hugo-theme-stack/exampleSite/目录下的config.yaml复制到网站根目录(也就是你的网站名这个目录)删除网站根目录的config.toml stack主题不需要这个配置文件打开网站根目录下的config.yaml进行填空博主头像放在/themes/hugo-theme-stack/a…

ansible下使用blockinfile添加配置信息到xml

#发文福利# 一、前言 1、目标&#xff1a;批量修改服务器上的xml配置文件 2、原配置文件的最后一部分内容如下 [roots40 tmp]# tail kahn.conf<value>nginx</value><description>my nginx config!</description> </property><property>…

fastjson远程命令执行

fastjson远程代码执行 漏洞原因&#xff1a;fastjson在对json字符串反序列化的时候&#xff0c;会读取到type的内容&#xff0c;将json内容反序列化为java对象并调用这个类的setter方法。 1、搭建rmi服务 直接利用jndi-exploit工具 2、抓包改为POST。开启nc监听、发包 PO…

python经典百题之求数字位数及逆序打印

题目&#xff1a;给一个不多于5位的正整数&#xff0c;要求&#xff1a;一、求它是几位数&#xff0c;二、逆序打印出各位数字 程序分析 我们需要编写一个程序&#xff0c;能够接受不多于5位的正整数&#xff0c;然后分析其位数&#xff0c;并逆序打印出各位数字。可以利用取…

前端面试题整理

1.沙箱隔离 前端沙箱隔离&#xff08;Frontend sandbox isolation&#xff09;是一种安全机制&#xff0c;用于将前端代码与主机环境隔离开来&#xff0c;以保护系统的安全性和稳定性。 在Web开发中&#xff0c;前端代码通常由JavaScript编写&#xff0c;而JavaScript是一种强…

Centos7 自部署中间件开机启动,以及java应用开机启动方法

一、zookeeper cd /etc/rc.d/init.d/ touch zookeeper chmod x zookeeper vi zookeeper#以下为内容&#xff0c;自行修改 路径#!/bin/bash ##chkconfig:2345 10 90#description:service zookeeper #修改为自己的目录 export ZOO_LOG_DIR/data/apache-zookeeper-3.7.0/logs…

贸易战的影响:跨境电商的“黑洞”风险与机遇

当今全球贸易局势充满了不确定性和动荡。贸易战的阴云笼罩下&#xff0c;跨境电商企业面临着前所未有的挑战&#xff0c;但与此同时&#xff0c;也蕴藏着巨大的机遇。本文将深入探讨贸易战对跨境电商的影响&#xff0c;以及企业在这个新现实中如何应对风险并寻找机遇。 贸易战的…

快手商品详情数据API接口【关键词搜索商品列表数据】APP端商品详情数据

快手商品API接口是快手电商平台为开发者提供的一组接口&#xff0c;允许开发者通过程序代码访问快手电商平台的商品数据&#xff0c;实现商品信息的获取等操作。以下是快手商品API接口的一些常用功能&#xff1a; 获取商品列表&#xff1a;通过该接口可以获取店铺或分类下的商…

npm常用命令系统介绍

npm常用命令系统介绍 npm helpnpm initpackage.json 文件package.json 文件属性说明默认 package.json 文件--参数[-yes|-y]设置 package.json 中字段的默认值package-lock.json 文件 npm [config|c]设置源 npm [install|i]可选参数&#xff1a;全局安装的特性 包的删除npm uni…

Vue3 - 实现动态获取菜单路由和按钮权限控制指令

GitHub Demo 地址 在线预览 前言 关于动态获取路由已在这里给出方案 Vue - vue-admin-template模板项目改造&#xff1a;动态获取菜单路由 这里是在此基础上升级成vue3和ts&#xff0c;数据和网络请求是通过mock实现的 具体代码请看demo!!! 本地权限控制&#xff0c;具体是通过…

(总目录)springboot - 实现zip文件上传并对zip文件解压, 包含上传oss

全文目录,一步到位 1.本文概述1.1 本文简介 2. 功能实现2.1 统一文件校验2.2 普通(多)文件上传[服务器]2.2.1 controller层2.2.2 service层2.2.3 业务impl实现类2.2.4 FileIOUtils工具包代码 2.3 zip文件的解压2.4 图片文件的压缩2.5 oss文件后端上传2.6 oss文件前端上传2.7 后…

matlab读写json文件

Background 通常&#xff0c;在matlab中使用mat文件进行数据存储。MAT文件是MATLAB中用来存储数据的二进制文件格式。MAT文件可以包含各种数据类型&#xff0c;包括数字、矩阵、向量、结构体、字符和函数等。但是&#xff0c;当和其他语言有交互时&#xff0c;mat文件会不太方便…