排序算法的补充

建议先去看看我之前写的基础排序算法

补充一:快排中partition函数的三种实现形式

1.hoare法---与第2种方法类似

int Partition1(int*a,int left,int 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;
}

2.挖坑法---也是基础排序算法里写的

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

3.双指针法

int Partition3(int* a, int left, int right) {int keyi = left;int pre = left, cur = left + 1;while (cur <= right) {if (a[cur] < a[keyi]) {pre++;swap(&a[pre],&a[cur]);}cur++;}swap(&a[pre], &a[keyi]);return pre;
}

举个例子帮助大家理解一下双指针法

 补充二:快排的非递归写法(栈的实现可以参考我之前写的栈和队列的实现)

本质和树的先序遍历的非递归写法一样

void QuickSortNonR(int* a, int left, int right) {ST st;StackInit(&st);//存放区间StackPush(&st, right);StackPush(&st, left);while (!StackEmpty(&st)) {int left = StackTop(&st);StackPop(&st);int right = StackTop(&st);StackPop(&st);int mid = PartSort1(a, left, right);if (mid - 1 > left) {//保证区间合法StackPush(&st, mid - 1);StackPush(&st, left);}if (mid + 1 < right) {//保证区间合法StackPush(&st, right);StackPush(&st, mid+1);}}StackDestroy(&st);
}

补充三:快排的三路划分写法---解决有多个重复数字的情况

//三路划分
void QuickSort_T(int* a, int left, int right) {if (left >= right)//保证区间合法return;int L = left, R = right;int key = a[left];int cur = left + 1;while (cur <= right) {if (a[cur] < key) {swap(&a[cur], &a[L]);L++;cur++;}else if (a[cur] == key) {cur++;}else {swap(&a[R], &a[cur]);R--;}}QuickSort_T(a, left, L - 1);QuickSort_T(a, R + 1, right);
}

举个例子

 补充4:计数排序

void CountSort(int* a, int n) {int min = a[0], max = a[0];for (int i = 1; i < n; i++) {if (a[i] < min)min = a[i];if (a[i] > max)max = a[i];}int range = max - min + 1;int* count_a = (int*)malloc(sizeof(int) * range);memset(count_a, 0, sizeof(int) * range);for (int i = 0; i < n; i++) {count_a[a[i] - min]++;}for (int i = 0,k = 0; i < range; i++) {while(count_a[i]--) {a[k++] = i + min;}}
}

补充五:归并排序的小优化(递归)

void _MergeSort(int* a, int left, int right, int* tmp) {if (left >= right)return;//小区间优化if (right - left + 1 < 10) {InsertSort(a + left, right - left + 1);return;}int mid = left + (right - left) / 2;_MergeSort(a, left, mid, tmp);_MergeSort(a, mid+1,right, tmp);//这里只能分成[left,mid][mid+1,right](因为mid=(left+right)/2)//如果分成[left,mid-1][mid,right]//当left和right相差为1时,mid=left//那么dfs(left,right)//=>dfs(left,mid-1)    dfs(mid,right)//<=>dfs(left,left-1)  dfs(left,right)//<=>return            dfs(left,mid-1) dfs(mid,right)//很显然,死递归了,问题就是在于dfs(left,right)一直在不停的重复递归int L1 = left, R1 = mid;int L2 = mid + 1, R2 = right;int k = 0;while (L1 <= R1 && L2 <= R2) {if (a[L1] < a[L2]) {tmp[k++] = a[L1++];}else{tmp[k++] = a[L2++];}}while (L1 <= R1)tmp[k++] = a[L1++];while (L2 <= R2)tmp[k++] = a[L2++];memcpy(a + left, tmp, sizeof(int) * k);
}
//归并
void MergeSort(int* a, int n) {int* tmp = (int*)malloc(sizeof(int) * n);_MergeSort(a, 0, n - 1, tmp);free(tmp);
}

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

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

相关文章

Hadoop 之 HDFS 伪集群模式配置与使用(二)

HDFS 配置与使用 一.HDFS配置二.HDFS Shell1.默认配置说明2.shell 命令 三.Java 读写 HDFS1.Java 工程配置2.测试 一.HDFS配置 ## 基于上一篇文章进入 HADOOP_HOME 目录 cd $HADOOP_HOME/etc/hadoop ## 修改文件权限 chown -R root:root /usr/local/hadoop/hadoop-3.3.6/* ## …

C++-string类的模拟实现

本博客基于C官方文档当中给出的string类当中的主要功能实现&#xff0c;来作为参照&#xff0c;简单模拟实现 My-string 。 对于C当中的string类的介绍&#xff0c;在之前的几篇博客当中有说明&#xff0c;如有问题&#xff0c;请参照一下两个博客文章进行参考&#xff1a; (2…

ERROR: Invalid requirement: ‘==‘ 解决python报错

ERROR: Invalid requirement: 错误:无效的要求: 今天安装 selenium包时突然触发这个报错&#xff0c;这个错误通常出现在使用pip安装Python包时&#xff0c;报错的原因是需要注意的是前后没有空格&#xff0c;若是加空格就会出现上述报错。 例如&#xff1a; 安装指定版本的…

python与深度学习(一):ANN和手写数字识别

目录 1. 神经网络2. 线性回归3. 激活函数3.1 Sigmoid函数3.2 Relu函数3.3 Softmax函数 4. ANN(全连接网络)模型结构5. 误差函数5.1 均方差误差函数5.2 交叉熵误差函数 6. 手写数字识别实战6.1 工具说明6.2 导入相关库6.3 加载数据6.4 数据预处理6.5 数据处理6.6 构建网络模型6.…

nginx+lua+redis环境搭建(文末赋上脚本)

目录 需求背景 环境搭建后nginx和redis版本 系统环境 搭建步骤 配置服务器DNS 安装ntpdate同步一下系统时间 安装网络工具、编译工具及依赖库 创建软件包下载目录、nginx和redis安装目录 下载配置安装lua解释器LuaJIT 下载nginx NDK&#xff08;ngx_devel_kit&#xff09…

Vue3警告提示(Alert)

可自定义设置以下属性&#xff1a; 警告提示内容&#xff08;message&#xff09;&#xff0c;类型&#xff1a;string | slot&#xff0c;默认&#xff1a;‘’警告提示的辅助性文字介绍&#xff08;description&#xff09;&#xff0c;类型&#xff1a;string | slot&#…

libvirt 热迁移流程及参数介绍

01 热迁移基本原理 1.1 热迁移概念 热迁移也叫在线迁移&#xff0c;是指虚拟机在开机状态下&#xff0c;且不影响虚拟机内部业务正常运行的情况下&#xff0c;从一台宿主机迁移到另外一台宿主机上的过程。 1.2 虚拟机数据传输预拷贝和后拷贝 预拷贝(pre-copy)&#xff1a; …

Git及Tortoisegit使用教程,设置中文

一、到git官网下载GIT 官网 二、下载安装Tortoisegit及中文语言包,Tortoisegit及语言包 语言包下载地址 三、在电脑某个盘的文件里右键 提示未设置git.exe 路径不能继续, 于是去下载git GIT下载 安装Git时, 一直点击 Next > 不要停, 直到结束 此时再跳到TortoiseGit…

Versal ACAP在线升级之Boot Image格式

1、简介 Xilinx FPGA、SOC器件和自适应计算加速平台&#xff08;ACAPs&#xff09;通常由多个硬件和软件二进制文件组成&#xff0c;用于启动这些设备后按照预期设计进行工作。这些二进制文件可以包括FPGA比特流、固件镜像、bootloader引导程序、操作系统和用户选择的应…

KaiwuDB CTO 魏可伟:多模架构 —“化繁为简”加速器

以下为浪潮 KaiwuDB CTO 魏可伟受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录&#xff0c;欢迎大家点赞、收藏、关注&#xff01; 打造多模引擎&#xff0c;AIoT数据库探索之路 01 何为“繁”&#xff1f; 工业 4.0 时代&#xff0c; 物联网产业驱动数据要素市场不…

蒙德里安的梦想

题目 求把 NM 的棋盘分割成若干个 12 的长方形&#xff0c;有多少种方案。 例如当 N2&#xff0c;M4 时&#xff0c;共有 5 种方案。当 N2&#xff0c;M3 时&#xff0c;共有 3 种方案。 如下图所示&#xff1a; 输入格式 输入包含多组测试用例。 每组测试用例占一行&…

速腾robosense-sdk配置和使用方法

官方的安装和配置教程https://github.com/RoboSense-LiDAR/rslidar_sdk/ 1.手动下载sdk&#xff0c;下载tar.gz&#xff0c;然后解压缩:Releases RoboSense-LiDAR/rslidar_sdk GitHub 2.个人电脑连接速腾激光雷达后&#xff0c;确保能够ping通。当连接网线后&#xff0c;电…