选择排序、冒泡排序、快速排序、归并排序

news2024/11/27 21:35:01

请添加图片描述

1、选择排序

设一个数据集有n个元素,选择这n个元素中最小的一个与第一个元素交换位置,再在剩下的n-1个元素中选择最小的一个与第二个元素交换位置,直到在最后两个元素中选择最小的一个放在倒数第二的位置上,简单选择排序是不稳定排序

f(a,n,i) 当i=n-1时:算法结束
f(a,n,i)否则:通过简单比较挑选a[i…n-1]中最小元素,a[k]放到a[i]处;f(a,n,i+1)

#include<iostream>

using namespace std;


//交换两个元素的值
void swap(int &x,int &y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
}
//输出数组a的所有元素
void pt(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
}
//利用递归实现简单排序
void SelectSort(int a[],int n,int i)
{
	int j,k;
	if(i==n-1) return; //满足递归出口条件
	else{
		k=i;//记录a[i...n-1]中最小元素的下标
		for(j=i+1;j<n;j++)//在a[i...n-1]找出最小元素a[k]
			if(a[k]>a[j])
				k=j;
		if(k!=i)//最小元素不是a[i]
		swap(a[i],a[k]);
		SelectSort(a,n,i+1);
	}
}
int main()
{
	int a[]={3,2,1,4,5,6,9,8,7};
	SelectSort(a,0,9);
	pt(a,9);
}

2、交换排序

2.1、冒泡排序

冒泡排序的基本思想是,对相邻的元素进行两两比较,顺序相反则进行交换。

#include<iostream>

using namespace std;


//交换两个元素的值
void swap(int &x,int &y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
}
//输出a的所有元素
void pt(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
}
//利用递归实现冒泡排序
void BubbleSort(int a[],int n,int i)
{
	int j;
	bool flag;
	if(i==n-1) return;
	else{
		flag=false;
		for(j=n-1;j>i;j--)
			if(a[j-1]>a[1])
			{
				swap(a[j],a[j-1]);
				flag=true;
			}
		if(flag==false)
			return;
		else
			BubbleSort(a,n,i+1);

	}
}
int main()
{
	int a[]={3,2,1,4,5,6,9,8,7};
	BubbleSort(a,9,0);
	pt(a,9);
}

2.2、快速排序

2.2.1、hoare(左右指针法)

2.2.2、挖坑法(递归)

时间复杂度最好情况nlogn
快速排序实现,从数组中选择一个key,数组中所有比key小的放左边,所有比key大的放右边,第一次递归,n个数被分为2部分,每部分2/n,第logn次递归,n个数被分为n部分,没部分为1,所以时间复杂度为nlogn
空间复杂度最坏情况n平方
如果第一次选择的是数组中的最大或最小值,则还需要递归n-1次,对于n个数来说需要n次递归,所以最坏时间复杂度为n的平方

#include<iostream>

using namespace std;
//输出数组a的值
void pt(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%d ",a[i]);
	printf("\n");
 } 
 //快速排序算法 
void QuickSort(int a[],int begin,int end)
{
	if(begin>=end)//如果一次递归开始大于末尾,则结束 
	return; 
	int key=a[begin];//第一个元素为基准 
	int left=begin,right=end;//保留原来初始,结束值 
	while(end>begin)
	{
		//小的放前面 
		while(a[end]>=key&&end>begin)
		end--;
		a[begin]=a[end];
		//大的放后面 
		while(a[begin]<=key&&end>begin)
		begin++;
		a[end]=a[begin]; 
	}
	a[begin]=key;
	int i=begin;
	QuickSort(a,left,i-1);//基准左侧排序 
	QuickSort(a,i+1,right);//基准右侧排序 
}
//主函数 
int main(){
	int a[]={6,5,9,7,11,3,2,5,8};
	QuickSort(a,0,9);
	pt(a,9);
}

3、归并排序

# include<iostream>
using namespace std;
//输出数组 
void pt(int a[],int n)
{
	int i;
	for(i=0;i<n;i++)
		cout<<a[i]<<" "; 
}
//归并
void Merge(int s[],int temp[],int start,int mid,int end)
{
	//i为左序列索引,j为右序列索引,k为暂存序列索引 
	int i=start,j=mid+1,k=start;
	//比较左右两个序列元素 
	while(i!=mid+1&&j!=end+1){
		//右序列元素小,就把右序列元素暂存到temp中 
		if(s[i]>s[j])
		temp[k++]=s[j++];
		//左序列元素小,就把左序列元素暂存到temp中
		else
		temp[k++]=s[i++];
	}
	//左序列有剩余 
	while(i!=mid+1)
		temp[k++]=s[i++];
	//右序列有剩余 
	while(j!=end+1)
		temp[k++]=s[j++];
		//将暂存序列赋值到原来序列中 
	for(int i=start;i<=end;i++)
		s[i]=temp[i];
 } 
 //拆分 
 void MergeSort(int s[],int t[],int start,int end)
{
	int mid;
	if(start<end)
	{
		mid=start+(end-start)/2;//避免溢出 
		MergeSort(s,t,start,mid);//左边部分递归划分 
		MergeSort(s,t,mid+1,end);//右边部分递归划分 
		Merge(s,t,start,mid,end);//合并俩个序列 
	}
}
int main()
{
	int a[9]={1,5,9,7,5,3,2,5,8};
	int b[9]; 
	MergeSort(a,b,0,8);//注意end=8 
	pt(a,9);
	return 0;
}

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

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

相关文章

【Arduino ESP32教程入门】Note

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析3 目录 &#x1f449;&#x1f3fb;arduino开发板引脚USB串行总线串行总线和并行总线的优…

Kerberos常见报错汇总

一.kdb5_util: Password mismatch while reading master key from keyboard 1>.错误复现 2>.错误原因分析 在初始化Kerberos数据库时需要输入密码&#xff0c;2次密码输入不一致就会导致该错误。 3>.解决方案 重新执行"kdb5_util -r YINZHENGJIE.COM create -s…

读书笔记--知识图谱基础概念与关键环节解析

知识图谱相当于一张网&#xff0c;是一种大型知识库&#xff0c;一种揭示实体之间关系的语义网络&#xff0c;是事物及其关系的形式化描述&#xff0c;分为通用知识图谱和领域&#xff08;行业&#xff09;知识图谱&#xff0c;如DBpedia&#xff0c;OpenKG&#xff0c;Wikidat…

IP行业查询API:为用户分析提供帮助

引言 在数字化时代&#xff0c;IP地址不仅代表着设备在互联网上的位置&#xff0c;还蕴含着丰富的信息。IP地址所属行业查询API应运而生&#xff0c;为用户分析提供了有力支持。本文将探讨这一工具的应用&#xff0c;以及对用户分析的帮助。 IP行业API的应用 1. 目标市场定位…

凉鞋的 Unity 笔记 102. 场景层次 与 GameObject 的增删改查

102. 场景层次 与 GameObject 的增删改查 在上一篇&#xff0c;我们完成了 Unity 引擎的 Hello world 输出&#xff0c;并且完成了第一个基本循环&#xff1a; 通过这次基本循环的完成&#xff0c;我们获得了一点点的 Unity 使用经验&#xff0c;这非常重要。 有实践经验后再…

C++(string类)

本节目标&#xff1a; 1、为什么要学习string类 2.标准库中的string类 3.vs和g下string结构说明 1.为什么学习string类 1.1 c语言中的字符串 C 语言中&#xff0c;字符串是以 \0 结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c; C 标准库中提供了一些 str系列的…

ROS2 库包设置和使用 Catch2 进行单元测试

说明 本文的目的是了解如何在 ROS2 中创建库&#xff0c;以供其他 ROS2 包使用。除此之外&#xff0c;本文还介绍了如何使用 catch2 框架编写单元测试。本文的第 1 部分将详细介绍如何创建库包。第 2 部分将介绍 ROS2 软件包如何利用创建的库 上篇 ROS2 库包设置和使用 Catch2…

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中&#xff0c;使用 CREATE TABLE 语句创建一个新表&#xff1a; CREATE TABLE …

二、BurpSuite Scan扫描

1.Scan details 解释&#xff1a;选择只是爬行还是爬行加代码审计 Scan Type&#xff1a;选择爬行或者代码审计URLs to scan&#xff1a;定义要扫描的网址。Burp将从这些网址开始进行爬行&#xff0c;并默认将包括指定网址文件夹下的所有内容。Protocol settings&#xff1a;使…

【Office】超简单,Excel快速完成不规则合并单元格排序

演示效果&#xff1a;将下图已经合并了的单元格按照单位名称排序并将同一个单位的数据合并在了一起。 Step 1&#xff1a;取消合并 选中所有的数据后&#xff0c;点击 “开始”-“合并单元格” &#xff0c;并且取消数据源的合并。 Step 2&#xff1a;填充数据 选中需要填…

宝塔反代openai官方API接口详细教程,502 Bad Gateway问题解决

一、前言 宝塔反代openai官方API接口详细教程&#xff0c;实现国内使用ChatGPT502 Bad Gateway问题解决&#xff0c; 此方法最简单快捷&#xff0c;没有复杂步骤&#xff0c;不容易出错&#xff0c;即最简单&#xff0c;零代码、零部署的方法。 二、实现前提 一台海外VPS服务…

Python Cartopy地图投影【3】

上两期文章见&#xff1a; Python Cartopy地图投影【1】 第一期文章内容纲要&#xff1a; step1: 开始地图投影 step2: GeoAxes 的常用方法 2.1 add_feature&#xff1a;添加海岸线、河流、湖泊等地理特征 2.2 gridlines&#xff1a;添加网格线以及相应标签等 Python Cartopy地…

最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

深度学习(2)---循环神经网络(RNN)

文章目录 一、序列数据和语言模型1.1 序列数据1.2 语言模型 二、循环神经网络(RNN)2.1 概述2.2 门控循环单元(GRU)2.3 长短期记忆网络(LSTM) 一、序列数据和语言模型 1.1 序列数据 1. 在深度学习中&#xff0c;序列数据&#xff08;Sequence data&#xff09;是指具有前后顺序…

华为:数据治理方法论

导读 本文先概要介绍了数据治理框架、数据治理组织架构和数据治理度量评估体系&#xff0c;然后结合华为数据治理案例和新冠疫情简单描述了数据治理的应用&#xff0c;最后描述了DAYU方法论在DataArts Studio产品上的落地以及详细的落地指导文档。 加gzh“大数据食铁兽”&am…

[题]欧拉函数 #欧拉函数

目录 欧拉函数一、用公式求代码 二、线性筛法求欧拉函数扩展欧拉定理 欧拉函数 AcWing 873. 欧拉函数 一、用公式求 定义&#xff1a;1 ~ N 中与 N 互质的数的个数被称为欧拉函数&#xff0c;记为ϕ(N)。 怎么求呢&#xff1f;&#xff1f; 有一个公式&#xff1a; N p1a1 X…

《Vue.js+Spring Boot全栈开发实战》简介

大家好&#xff0c;我是老卫。 恰逢中秋国庆双节&#xff0c;不想出门看人山&#xff0c;惟愿宅家阅书海&#xff01; 今天开箱的这本书是《Vue.jsSpring Boot全栈开发实战》。 外观 从书名故名思议&#xff0c;就是基于Vue.jsSpring Boot来实现企业级应用全栈开发。 该书由…

(2023,ControlNet,CFGRW,diffusion,控制组合)向文本到图像扩散模型添加条件控制

Adding Conditional Control to Text-to-Image Diffusion Models 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2.相关工作 2.1. 微调神经网络 2.2. 图像扩散 …

基于electron25+vite4创建多窗口|vue3+electron25新开模态窗体

在写这篇文章的时候&#xff0c;查看了下electron最新稳定版本由几天前24.4.0升级到了25了&#xff0c;不得不说electron团队迭代速度之快&#xff01; 前几天有分享一篇electron24整合vite4全家桶技术构建桌面端vue3应用示例程序。 https://www.cnblogs.com/xiaoyan2017/p/17…

【C++哈希应用】位图、布隆过滤器

【C哈希应用】位图、布隆过滤器 目录 【C哈希应用】位图、布隆过滤器位图概念位图的实现位图改造位图应用总结布隆过滤器布隆过滤器的提出布隆过滤器的概念布隆过滤器的查找布隆过滤器删除布隆过滤器优点布隆过滤器缺陷 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2023.9…