排序算法的补充

news2025/2/2 4:31:48

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

补充一:快排中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.coloradmin.cn/o/762640.html

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

相关文章

pytest+yaml接口自动化测试框架封装

1. 框架封装基础 以下是框架封装的技术基础&#xff0c;打好这些基础的话&#xff0c;能够很轻松地封装出来框架 对于基础还有欠缺的话&#xff0c;建议针对性精进&#xff1a; 1. 扎实的Python语言基础 函数、类文件读写处理报错数据结构标准库测试框架库&#xff08;unit…

goland设置内置命令行为当前项目环境

goland设置内置的命令行为当前项目环境 修改 GoLand 中的 SSH 终端配置即可

125、仿真-基于51单片机的自行车电动车或者电机数码管控制系统设计(Proteus仿真+程序+原理图+配套资料等)

方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ&#xff0c;在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

linux守护进程介绍 | Linux的热拔插UDEV机制

简介 udev是一个设备管理工具&#xff0c;udev以守护进程的形式运行&#xff0c;通过侦听内核发出来的uevent来管 理/dev目录下的设备文件。udev在用户空间运行&#xff0c;而不在内核空间 运行。它能够根据系统中的硬 件设备的状态动态更新设备文件&#xff0c;包括设备文件的…

详解Single-Shot Alignment Network (S2A-Net) ,详解AlignConv,基于遥感图像的特征对齐旋转目标检测

引言 目标检测&#xff1a;把图像中的物体使用方框标记起来&#xff0c;不同类别物体应使用不同颜色 目标检测其实是寻找物体边界框(bounding box)回归问题(regression)和对物体分类问题(classification)的统一 遥感目标检测&#xff1a;普通的目标检测是日常生活中的横向的图…

JavasScript基础第一部分

此文章&#xff0c;来源于印客学院的资料&#xff0c;然后补充的。 此文档不一定涵盖了所有知识点&#xff0c;只是一个大概方向&#xff0c;仅供参考。 也算一个查漏补缺&#xff0c;诸君可以根据自己实际情况&#xff0c;自行衡量&#xff0c;看看哪里需要补充。 JavaScri…

【CentOS安装make】

问题&#xff1a; bash: make: command not found 1、去官网查找最新版本 http://ftp.gnu.org/pub/gnu/make/ 查找最新安装包 2、下载解压缩 wget http://ftp.gnu.org/pub/gnu/make/make-4.2.tar.gz tar -zxvf make-4.2.tar.gz cd make-4.2mkdir buildcd build../configure…

度量学习和表征学习

度量学习 定义 计算特征之间的距离&#xff08;特征之间相乘&#xff09;&#xff0c;通过距离损失优化模型——>度量距离相关的损失函数 图片出自《【极市】张宇涵-CVPR2020 Oral&#xff5c;Circle Loss&#xff0c;从统一视角提升深度特征学习能力_哔哩哔哩_bilibili》…

短视频矩阵系统源码搭建--附赠代码

说明&#xff1a;本开发文档适用于短视频矩阵系统源码开发搭建&#xff0c;短视频seo矩阵源码开发搭建&#xff0c;抖音短视频seo源码开发搭建&#xff0c;抖音矩阵系统源码开发搭建等SaaS类产品开发场景。 短视频矩阵系统开发围绕的开发核心维度&#xff1a; 1. 多账号原理开…

shell脚本定时删除大小超200M的日志文件

需求 某个服务器的日志文件随着时间的增长越来越多&#xff0c;我不想自己一个个的删除&#xff0c;但是不删除的话&#xff0c;会很麻烦&#xff0c;万一因为日志文件导致内存满了就麻烦了&#xff01; 实现步骤 1、写好实现的脚本 我要查找>200M的日志文件 find / -typ…

苹果平板电容笔好用吗?第三方apple pencil推荐

自从苹果推出了ipad的电容笔之后&#xff0c;一直在市场上保持着十分火爆的热度&#xff0c;但是因为Apple Pencil的价格太高&#xff0c;一般的消费者根本没有足够预算去入手。所以市场上就不断涌现出了不少可以很好代替Apple Pencil的平替电容笔&#xff0c;并且深受人们的热…

BTY Ecosystem DNS‘s Ideas of DeSoc

In May 2022, Ethereum founder Vitalik Buterin, economist Glen Weyl and Flashbots researcher Puja Ohlhaver jointly released “Decentralized Society: Finding Web3s Soul”. The core idea of this paper is the possibility of creating a decentralized society aro…

数据结构与算法基础(青岛大学-王卓)(6)

啊呀呀&#xff0c;不小心又断更快一个月了&#xff0c;我还是认真每天学习滴&#xff0c;最近还是香瓜&#xff0c;菜瓜&#xff0c;西瓜&#xff0c;羊角蜜不能停口啊&#xff0c;哈哈&#xff0c;二叉树这一章真是硬茬&#xff0c;难啃啊。 文章目录 [toc]树和二叉树树的定义…

linux扩大原磁盘后,扩大lvm空间

需求背景 原centos7虚机是将一块裸盘&#xff08;未分区&#xff09;通过lvm的方式挂载到/data目录下&#xff0c;现因业务需要&#xff0c;需要增加/data目录的磁盘空间&#xff0c;现在虚机管理平台上将原磁盘增加20G空间。 注意&#xff1a;如果是新增加一个磁盘&#xff…

二十、移动端网页开发-px 和 vw基础知识

目录&#xff1a; 1. 基础准备 2. vw 详解 一、基础准备 1. 观察你的html里面有没有meta完美视口设置&#xff0c;如果有&#xff0c;就不用再管&#xff0c;如果没有&#xff0c;就加上。 <head><meta charset"UTF-8"><meta http-equiv"X-UA-C…

Fiddler抓包app(方便后端定位app调用的是那个接口?参数为何?)

一、抓http请求的包 1、设置Fiddler允许远程连接 选择Tools->Options 选择Connections选项卡&#xff0c;选中允许远程连接&#xff0c;如图所示 2、手机与电脑连接相同的wlan网络 3、手机wlan设置手动代理&#xff0c; 1&#xff09;手动代理的主机名设为电脑ip&…

开放式耳机的类型有哪些?开放式耳机和封闭式耳机的区别?

今天来跟大家聊聊开放式耳机&#xff0c;其中开放式耳机类型有哪些&#xff1f;开放式耳机和封闭式耳机的区别在哪&#xff1f;市面上这么多开放式耳机&#xff0c;到底哪款开放式耳机才好用&#xff1f;下面一起来了解&#xff01; 一、什么是开放式耳机&#xff1f; 开放式…

新增进程管理、SSH会话管理功能,1Panel开源面板v1.4.0发布

2023年7月17日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.4.0版本。 在这个版本中&#xff0c;1Panel新增了进程管理和SSH会话管理功能&#xff1b;支持容器编辑和升级&#xff0c;数据库兼容MySQL 5.6&#xff1b;备份账号可以添加微软OneDrive&…

数字孪生和VR的结合将会带来怎样的改变?

随着科技的不断发展&#xff0c;数字孪生和虚拟现实&#xff08;VR&#xff09;这两个前沿技术正在逐渐融合&#xff0c;为各行各业带来了前所未有的改变。 数字孪生技术本身已经可以高度还原现实世界&#xff0c;而VR技术则能通过头戴式设备&#xff0c;让用户沉浸在这个虚拟…

uniapp editor组件 如何上传图片

需求&#xff1a;我们在使用uniapp的editor组件时&#xff0c;主要是为了保持输入内容的格式。里面的文字可以有颜色、粗体、排列样式&#xff0c;可以插入图片。就像下面这样。 一、如何处理图片&#xff0c;好让它在 rich-text组件中显示 &#xff1f; 逻辑&#xff1a;我们…