排序复习_代码纯享

news2025/3/31 19:21:18

头文件

#pragma once
#include<iostream>
#include<vector>
#include<utility>
using std::vector;
using std::cout;
using std::cin;
using std::endl;
using std::swap;

//插入排序
//1、直接插入排序(稳定)
void InsertSort(vector<int>& v);
//2、希尔排序
void ShellSort(vector<int>& v);

//选择排序
//1、直接选择排序
void SelectSort(vector<int>& v);
//2、堆排序
void HeapSort(vector<int>& v);

//交换排序
//1、冒泡排序(稳定)
void BubbleSort(vector<int>& v);
//2、快速排序
void QuickSortTest(vector<int>& v);

//归并排序(稳定)
void MergeSort(vector<int>& arr, int left, int right);

//计数排序
void CountSort(vector<int>& v);

void Print(vector<int>& v);

排序代码

#define  _CRT_SECURE_NO_WARNINGS
#include"sort.h"

void Print(vector<int>& v) {
	for (int e : v) {
		cout << e << " ";
	}
	cout << endl;
}

void InsertSort(vector<int>&v) {
	int n = v.size();
	for (int i = 0; i < n - 1; i++) {
		int end = i;
		int tmp = v[end + 1];
		while (end >= 0) {
			if (tmp < v[end]) {
				v[end + 1] = v[end];
				--end;
			}
			else {
				break;
			}
		}
		v[end + 1] = tmp;
	}
}

void ShellSort(vector<int>& v) {
	int n = v.size();
	int gap = n;
	while (gap > 1) {
		gap = gap / 3 + 1;
		for (int i = 0; i < n - gap; ++i) {
			int end = i;
			int tmp = v[end + gap];
			while (end >= 0) {
				if (v[end] > tmp) {
					v[end + gap] = v[end];
					end = end - gap;
				}
				else {
					break;
				}
			}
			v[end + gap] = tmp;
		}
	}
}

void SelectSort(vector<int>& v) {
	int n = v.size();
	int begin = 0, end = n - 1;
	while (begin < end) {
		int mini = begin;
		int maxi = end;
		for (int i = begin + 1; i < end; i++) {
			if (v[mini] > v[i]) {
				mini = i;
			}
			if (v[maxi] < v[i]) {
				maxi = i;
			}
		}
		swap(v[mini], v[begin]);
		if (maxi == begin) {
			maxi = mini;
		}
		swap(v[maxi], v[end]);
		++begin;
		--end;
	}
}

void AdjustDown(vector<int>& v, int parent, int size) {
	int n = size;
	int child = parent * 2 + 1;
	while (child < n) {
		if (child + 1 < n && v[child + 1] > v[child]) {
			++child;
		}
		if (v[child] > v[parent]) {
			swap(v[child], v[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else {
			break;
		}
	}
}

void HeapSort(vector<int>& v) {
	int n = v.size();
	for (int i = (n - 2) / 2; i >= 0; i--) {
		AdjustDown(v, i, n);
	}
	int end = n - 1;
	while (end) {
		swap(v[0], v[end]);
		AdjustDown(v, 0, end);
		--end;
	}
}

void BubbleSort(vector<int>& v) {
	int n = v.size();
	for (int j = 0; j < n; j++) {
		bool exchange = false;
		for (int i = 1; i < n - j; i++) {
			if (v[i] < v[i - 1]) {
				swap(v[i], v[i - 1]);
				exchange = true;
			}
		}
		if (exchange == false)
			break;
	}
}

void QuickSort(vector<int>& v, int begin, int end) {
	if (begin >= end)
		return;
	int left = begin;
	int right = end;
	int key = begin;
	while (left < right) {
		while (left < right && v[right] >= v[key]) {
			right--;
		}
		while (left < right && v[left] <= v[key]) {
			left++;
		}
		swap(v[right], v[left]);
	}
	swap(v[key], v[left]);
	key = left;
	//begin  key  end
	QuickSort(v, begin, key - 1);
	QuickSort(v, key + 1, end);
}

void QuickSortTest(vector<int>& v) {
	int n = v.size();
	int begin = 0;
	int end = n - 1;
	QuickSort(v, begin, end);
}
 
// 合并两个已排序的子数组
void Merge(vector<int>& arr, int left, int mid, int right) {
	int n1 = mid - left + 1;
	int n2 = right - mid;

	// 创建临时数组
	vector<int> L(n1), R(n2);

	// 拷贝数据到临时数组 L[] 和 R[]
	for (int i = 0; i < n1; i++)
		L[i] = arr[left + i];
	for (int j = 0; j < n2; j++)
		R[j] = arr[mid + 1 + j];

	// 归并临时数组到 arr[left..right]
	int i = 0; // 初始化第一个子数组的索引
	int j = 0; // 初始化第二个子数组的索引
	int k = left; // 初始归并子数组的索引

	while (i < n1 && j < n2) {
		if (L[i] <= R[j]) {
			arr[k] = L[i];
			i++;
		}
		else {
			arr[k] = R[j];
			j++;
		}
		k++;
	}

	// 拷贝 L[] 的剩余元素
	while (i < n1) {
		arr[k] = L[i];
		i++;
		k++;
	}

	// 拷贝 R[] 的剩余元素
	while (j < n2) {
		arr[k] = R[j];
		j++;
		k++;
	}
}

// 归并排序函数
void MergeSort(vector<int>& arr, int left, int right) {
	if (left < right) {
		// 找到中间点
		int mid = left + (right - left) / 2;

		// 递归排序左半部分
		MergeSort(arr, left, mid);
		// 递归排序右半部分
		MergeSort(arr, mid + 1, right);

		// 合并已排序的两部分
		Merge(arr, left, mid, right);
	}


void CountSort(vector<int>& v) {
	int n = v.size();
	int max = v[0];
	int min = v[0];
	for (int i = 0; i < n; i++) {
		if (v[i] < min)
			min = v[i];
		if (v[i] > max)
			max = v[i];
	}
	int range = max - min + 1;
	vector<int> count(range, 0);

	//统计每个元素出现的次数
	for (int num : v) {
		++count[num - min];
	}
	//输出
	int j = 0;
	for (int i = 0; i < range; i++) {
		while (count[i]) {
			v[j] = i + min;
			j++;
			count[i]--;
		}
	}
}

测试排序代码

#define  _CRT_SECURE_NO_WARNINGS
#include"sort.h"

int main() {
	vector<int> v = { 3,5,1,4,2,7,6 };
	Print(v);

	//InsertSort(v);
	//ShellSort(v);
	//SelectSort(v);
	//BubbleSort(v);
	//HeapSort(v);
	//QuickSortTest(v);
	MergeSort(v, 0, 6);
	Print(v);

}

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

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

相关文章

【STM32】第一个工程的创建

目录 1、获取 KEIL5 安装包2、开始安装 KEIL52.1、 激活2.2、安装DFP库 3、工程创建4、搭建框架5、开始编写代码 1、获取 KEIL5 安装包 要想获得 KEIL5 的安装包&#xff0c;在百度里面搜索“KEIL5 下载”即可找到很多网友提供的下载文件&#xff0c;或者到 KEIL 的官网下载&a…

SpringBoot+策略模式+枚举类,优雅消除if-else

需求分析 公司做物联网系统的&#xff0c;使用nettry进行设备连接&#xff0c;对设备进行数据采集&#xff0c;根据设备的协议对数据进行解析&#xff0c;解析完成之后存放数据库&#xff0c;但是不同厂家的设备协议不同。公司系统使用了使用了函数式编程的去写了一个解析类&am…

前端框架学习路径与注意事项

学习前端框架是一个系统化的过程&#xff0c;需要结合理论、实践和工具链的综合掌握。以下是学习路径的关键方面和注意事项&#xff1a; 一、学习路径的核心方面 1. 基础概念与核心思想 组件化开发&#xff1a;理解组件的作用&#xff08;复用性、隔离性&#xff09;、组件通信…

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架

Linux驱动开发-①platform平台②MISC字符驱动框架③input框架 一&#xff0c;platform1.1 platform框架&#xff08;设备树下&#xff09;1.2 platform框架&#xff08;配置设备函数&#xff09; 二&#xff0c;MISC字符驱动框架三&#xff0c;input框架 一&#xff0c;platfor…

【mysql】唯一性约束unique

文章目录 唯一性约束 1. 作用2. 关键字3. 特点4. 添加唯一约束5. 关于复合唯一约束 唯一性约束 1. 作用 用来限制某个字段/某列的值不能重复。 2. 关键字 UNIQUE3. 特点 同一个表可以有多个唯一约束。唯一约束可以是某一个列的值唯一&#xff0c;也可以多个列组合的值唯…

常见中间件漏洞:Jboss篇

CVE-2015-7501 环境搭建 cd vulhub-master/jboss/JMXInvokerServlet-deserialization docker-compose up -d 过程 访问网址&#xff0c;存在页面说明接口存在且存在反序列化漏洞 http://8.130.17.222:8080/invoker/JMXInvokerServlet 2.下载 ysoserial ⼯具进⾏漏洞利⽤…

2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)

龙卷风优化算法&#xff08;Tornado optimizer with Coriolis force&#xff09;是发表在中科院二区期刊“ARTIFICIAL INTELLIGENCE REVIEW”&#xff08;IF&#xff1a;11.7&#xff09;的2025年智能优化算法 01.引言 当自然界的狂暴之力&#xff0c;化身数字世界的智慧引擎&…

3.24-3 接口测试断言

一.postman 断言 1.断言再test中 #状态码是否等于200 tests["Status code is 200"] responseCode.code 200; #断言响应时间小于200ms tests["Response time is less than 200ms"] responseTime < 200; #断言响应体包含内容 tests["Body…

DeepSeek面试——模型架构和主要创新点

本文将介绍DeepSeek的模型架构多头潜在注意力&#xff08;MLA&#xff09;技术&#xff0c;混合专家&#xff08;MoE&#xff09;架构&#xff0c; 无辅助损失负载均衡技术&#xff0c;多Token 预测&#xff08;MTP&#xff09;策略。 一、模型架构 DeepSeek-R1的基本架构沿用…

Python----计算机视觉处理(Opencv:图像亮度变换)

一、图像亮度变换 亮度调整&#xff1a;图像像素强度整体变高或者变低。 对比度调整&#xff1a;图像暗处像素强度变低&#xff0c;图像亮处像素强度变高&#xff0c;从而拉大中间某个区域范围的显示精 度。 A&#xff1a;原图 …

无人机动平衡-如何在螺旋桨上添加或移除材料

平衡无人机螺旋桨是一项精细的工作&#xff0c;直接影响飞行稳定性和组件寿命。不同的方法适用于不同的情况&#xff0c;螺旋桨的材料和尺寸以及所需调整的幅度都会影响选择的方法。 本文将深入探讨添加如胶水和胶带等材料的方法&#xff0c;以及通过打磨和修剪来移除质量的方…

基于python的租房网站-房屋出租租赁系统(python+django+vue)源码+运行步骤

该项目是基于python/django/vue开发的房屋租赁系统/租房平台&#xff0c;作为本学期的课程作业作品。欢迎大家提出宝贵建议。给师弟开发的课程作业&#xff0c;技术学习可以留言哦 功能介绍 平台采用B/S结构&#xff0c;后端采用主流的PythonDjango进行开发&#xff0c;前端采…

涨薪技术|k8s设计原理

01k8s介绍 Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化 工作负载和服务&#xff0c;有助于实现声明性配置和自动化。它有一个庞大、快速增长的生态系统。Kubernetes 服务、支持和工具广泛可用。Kubernetes 这个名字起源于希腊语&#xff0c;意思是舵…

基于FPGA的16QAM+帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 16QAM调制解调原理 2.2 帧同步 3.Verilog核心程序 4.完整算法代码文件获得 1.算法仿真效果 vivado2019.2仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 设置SNR12db 将FPGA数据导入到MATLAB显…

QuecPython 外设接口之GPIO应用指南

基础知识 了解GPIO基础知识更有益于我们使用它。 框图 GPIO&#xff08;通用输入输出&#xff09;是指一种通用的数字输入/输出接口&#xff0c;用于与外部电子元件或设备进行通信。它通常存在于微处理器、微控制器和其他嵌入式系统中。 物理电路结构如下图所示&#xff1a…

Spring Boot 整合 Nacos 注册中心终极指南

在微服务架构中&#xff0c;配置管理和动态路由是核心需求。Nacos 作为阿里巴巴开源的动态服务发现、配置管理和服务管理平台&#xff0c;能够帮助开发者实现配置热更新、多环境共享配置以及动态路由管理。本文将结合 Spring Boot 和 Spring Cloud Gateway&#xff0c;手把手教…

SQLServer列转行操作及union all用法

1.创建测试表及数据sql如下 create table ScoresTable( Name varchar(50), ChineseScore int, MathScore int ) insert into ScoresTable values(小张,90,95) insert into ScoresTable values(小王,98,99) 2.表中查询结果如下 3.现需列转行显示&#xff0c;每行显示 姓名…

【GL010】C++

1.C中的const关键字有哪些用法&#xff1f; 1.修饰变量&#xff1a;表示变量的值不可修改。 const int a 10; 2.修饰指针&#xff1a; const int* p&#xff1a; // 指针指向的内容不可修改。 int* const p&#xff1a; // 指针本身不可修改。 const int* const…

(Arxiv-2025)MagicDistillation:用于大规模人像少步合成的弱到强视频蒸馏

MagicDistillation&#xff1a;用于大规模人像少步合成的弱到强视频蒸馏 paper是HKUST发布在Arxiv 2025的工作 paper title&#xff1a;MagicDistillation: Weak-to-Strong Video Distillation for Large-Scale Portrait Few-Step Synthesis Project page&#xff1a;地址 Abst…

Excel(进阶篇):powerquery详解、PowerQuery的各种用法,逆透视表格、双行表头如何制作透视表、不规则数据如何制作数据透视表

目录 PowerQuery工具基础修改现有数据理规则PowerQuery抓取数据的两种方式多文件合并透视不同表结构多表追加数据透视追加与合并整理横向表格:逆透视 数据用拆分工具整理数据算账龄 不等步长值组合合并文件夹中所有文件PowerQuery处理CSV文件双行表头、带合并单元格如何做数据…