数据结构-排序

数据结构排序

  • 1 知识框架
  • 2 插入排序
    • 2.1 直接插入排序
    • 2.2 折半插入排序
    • 2.3 希尔排序
  • 3 交换排序
    • 3.1 冒泡排序
    • 3.2 快排
  • 4 选择排序
    • 4.1 简单选择排序
    • 4.2 堆排序
  • 5 归并和基数排序
    • 5.1 归并排序
    • 5.2 基数排序

1 知识框架

在这里插入图片描述

算法的稳定性:;两个相同的元素在排序算法完成后,两者的相对位置还没改变,则算法是稳定的。
内部排序算法总览:
在这里插入图片描述

2 插入排序

2.1 直接插入排序

//      升序排列L[]
void insertSort(int L[],int n)
{
	for(int i = 2;i <= n;i ++)
	{
		if(L[i] < L[i - 1])
		{
			L[0] = L[i-1];
			for(int j = i - 1;L[0] < L[j];j --)
			{
				L[j + 1] = L[j];
			}
			L[j + 1] = L[0];
		}
	}
}    // L[0] 哨兵作用

空间效率:仅使用常数个辅助单元,因此为O(1)。
时间效率:最好的情况O(n),最坏的情况O(n²),因此时间复杂度为O(n²)

2.2 折半插入排序

直接插入是边比较边插入,折半先找到元素要插入的位置,然后统一移动元素

void insertSort(int L[],int n)
{
	int i,j,low,high;
	for(i = 2;i <= n;i ++)
	{
		L[0] = L[i];
		low = 1,high = i - 1;
		while(low <= high)
		{
			mid = (low + high) / 2;
			if(L[mid] > L[0]) high = mid -1;
			else low = mid + 1;
		}  // 找出待插入位置
		for(j = i - 1;j >= high + 1;j --)
		{
			L[j + 1] = L[j];
		}//  统一移动元素
		L[high + 1] = L[0];
	}
}

改变了元素的比较次数,移动次数并没有改变,时间复杂度仍为O(n²)。
但他适用于数据量不大的排序表。

2.3 希尔排序

void insertSort(int L[],int n)
{
	int i,j,dk;
	for(dk = n / 2;dk >= 1;dk = dk / 2)   //dk的选取以及变化不是固定的
		for(i = dk + 1;i <= n; i ++)
			if(L[i] < L[i - dk])
				{
					L[0] = L[i];
					for(j = j - dk;j > 0 && L[0] < L[j]; j-= dk)
						{
							L[j + dk] = L[j]     //元素后移
						}
					L[j + dk] = L[0];
				}
}

空间:O(1)
时间:涉及dk的选取,时间分析比较困难,约为O(n的1.3次方)
适用线性表为顺序存储的情况

3 交换排序

3.1 冒泡排序

void bubbleSort(int l[],int n)
{
	int temp;
	for(int i = 0;i <= n;i ++)                //比较次数
		for(int j = n - 1;j > i;j --)
			{
				if(l[j] < l[j - 1)
				{
					temp = l[j];
					l[j] = l[j - 1];
					l[j - 1] = temp;
				}
			}
}

空间:使用常数辅助,为O(1)
时间:平均时间复杂度O(n²)

3.2 快排

#include<stdio.h>
int n,i,j,a[100];  //定义全局变量 

void quicksort(int left, int right)   
{
	int temp,t;   //temp变量是基准,t变量是用来交换的第三变量 
	if(left > right)   //跳出循环的第一个条件 
	{
		return;
	}
	
	temp = a[left];   //此时选用的是第一个数当做基准 
	i = left;     //i是1 
	j = right;     //j是n 
	while(i != j)     //当i,j没有走到一块的时候 
	{
		while(a[j] >= temp && i<j)   //j一步一步左移,查找比基准值小的数 
		{
			j--;
		}
		while(a[i] <= temp && i<j)   //i一步一步右移,查找比基准值大的数 
		{
			i++;
		}
		if(i < j)
		{
			t = a[i];    //将j查到的比基准值的数与i查到的比基准值小的数交换 
			a[i] = a[j];  //即将小的数放在基准值左边 
			a[j] = t;      //将大的数放在基准值右边 
		}
	}
	  //将基准值归位 
	a[left] = a[i];    //当循环结束时,i=j,在中间某一位置 
	a[i] = temp;      //将那一位置的数与基准值交换 
	
	//递归 ,将基准值左边分为一部分
   //将基准值右边分为一部分 
	quicksort(left,i-1);     //继续处理左半部分的数    
	quicksort(i+1,right);   //继续处理右半部分的数 
	return ;
}

int main()  //主函数 
{
	scanf("%d",&n);  //用来限制输入的个数 
	for(i=1; i<=n; i++)
	{
		scanf("%d",&a[i]); //读入数据 
	}
	quicksort(1,n);  //调用快排函数 
	for(i=1; i<=n; i++) 
	{
		printf("%d\t",a[i]);  //循环输出 
	}
}


通过二叉树来判断 每次选取左边第一个数做根结点
在这里插入图片描述
空间:平均情况栈的深度为O(log₂n)
时间:平均复杂度为O(nlog₂n)
快排是所有内部排序算法中平均性能最优的排序算法

4 选择排序

4.1 简单选择排序

void selectSort(int l[],int n)
{
	for(int i = 0;i < n - 1;i ++)
	{
		int min = i;
		for(int j = i + 1;j < n;j ++)
			if(l[j] < l[min])min = j;
		if(min != i)swap(l[i],l[min]);
	}
}

空间:O(1)
时间:O(n²)

4.2 堆排序

1.构造初始堆
架设构造大根堆
第一步从n / 2 - 1 ~ 1的顺序,看该结点的值是否小于子结点的值,若小于,则与子结点较大值交换。
第二步,若交换后的结点破坏了下一级的堆,子结点采用第一步的方法构造下一级堆。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.输出堆顶元素
3.将堆底元素送入堆顶,重新构造堆
重新构造的堆的方法就是第二步

空间:O(1)
时间:平均复杂度为O(nlog₂n)

5 归并和基数排序

5.1 归并排序

将n个有序的子表,两两合并,直到合并成一个长度为n的有序表,称为2路归并排序
在这里插入图片描述
如何将两个子表合并:
假设两端有序表为A[l,m],A[m + 1,h]将两个表复制到B数组中,分别从两端取数进行比较,将较小的存入A中,一段会先存完,将没有存完的剩下那段的数字直接复制到A中

void merge(int a[],int l,int m,int h)
{
	for(int i = l;i <= h;i ++)
		b[i] = a[i];
	for(i = l,j = mid + 1,k = i;i <= mid&& j <= h;k ++)
	{
		if(b[i] <= b[j])            // 较小放入a中
			a[k] = b[i ++];
		else
			a[k] = b[j ++];
	}
	while(i <= mid) a[k ++] = b[i ++];  // 第一个表没复制完
	while(j <= h) a[k ++] = b[j ++];	// 第二个表没复制完
}

空间复杂度:O(n)
时间:平均复杂度为O(nlog₂n)

5.2 基数排序

通常有两种方法:
1,最高位优先(MSD)
2,最低位优先(LSD)
举例低位优先
在这里插入图片描述

在这里插入图片描述
最后是得出的有序序列
空间:使用r个队列,因此为O®
时间:进行d趟收集和分配,一趟分配需要O(n),一趟收集需要O®,因此时间复杂度为O(r + n)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

swiftUI和swift的区别

概述 SwiftUI是苹果公司推出的一种用于构建iOS、macOS、watchOS和tvOS应用程序界面的框架。它是基于Swift编程语言开发的&#xff0c;旨在简化UI开发过程并提供实时预览功能&#xff0c;使开发人员可以更快地构建出漂亮的应用程序界面。 Swift是苹果公司推出的一种面向对象的…

c++ word简单的写文本与画表格只支持docx

简单使用的代码如下所示&#xff1a; #include "stdafx.h" #include <windows.h> #include "minidocx.hpp" using namespace docx; using namespace std; std::string GB2312ToUTF8(const std::string& gb2312) { int len MultiByteToWid…

RK3588平台开发系列讲解(Camera篇)V4L2 主要特性

文章目录 一、V4L2 介绍1.1、模块化的架构1.2、统一的设备节点1.3、统一的视频数据格式1.4、支持多种视频设备1.5、支持流式 I/O1.6、支持控制参数1.7、支持事件通知二、V4L2使用场景沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要讲解V4L2 主要特性。 一、…

首发价11999元?华为智慧屏S3Pro电视7月10日上市

华为最新推出了两款全新的智慧屏 S3 Pro&#xff0c;分别是65英寸和75英寸版本&#xff0c;售价分别为5999元和7999元。除此之外&#xff0c;华为还推出了全新的S3 Pro 86英寸型号&#xff0c;首发价为11999元。这款电视将于7月10日上市&#xff0c;对于感兴趣的用户来说&#…

视频关键帧AI化的多种方法

视频关键帧AI化的逻辑是将视频切分成一帧帧的画面&#xff0c;然后使用SD绘画固定风格&#xff0c;最后统一在拼接在一起成为一个新的视频。 不管是Mov2Mov还是Multi Frame都能制作这种视频。但是这些操作起来比较麻烦&#xff0c;经过尝试处理较稳定的方法是可以通过img2im的…

C语言学习准备-编辑器选择

今天继续给大家更新C语言经典案例 今天的案例会比昨天稍微有一些难度&#xff0c;但是同时还是非常经典的案例 本来是想给大家继续更新C语言经典案例&#xff0c;但是有朋友反应C语言编辑器的选择&#xff0c;刚好我自己也是想更换一下C语言的编辑器&#xff0c;跟大家分享一下…

基于Web的智慧交通3D可视化系统

前言 城市交通是城市社会活动、经济活动的纽带和动脉&#xff0c;智慧交通系统对城市经济发展和人民生活水平起着极其重要的作用。 背景 随着我国城市化进程不断加快&#xff0c;现代城市交通问题日益受到人们的关注。特别是汽车数量的与日俱增&#xff0c;给城市带来了大量…

中国物流,驶入大航海时代

出海的一体化&#xff0c;不仅仅是物流的一体化&#xff0c;更是产业链、供应链的一体化。在诸多问题下&#xff0c;想要帮助企业更好地出海&#xff0c;就不能只专注于自身的长板&#xff0c;而是需要先补齐短板。 作者|斗斗 编辑|皮爷 出品|产业家 出海时代真的要来了。…

类Twitter风格的RSS阅读器

本文完成于 2 月中旬&#xff0c;其中的反代还是 frp npm 方案&#xff1b; 什么是 RSS ? RSS 是用 PHP、Laravel、Inertia.js、Tailwind 和 Vue.js 编写的简单的类Twitter 风格的 RSS阅读器&#xff0c;支持 RSS和ATOM 格式。 命令行安装 在群晖上以 Docker 方式安装。 官…

刷题日记06《回溯算法》

问题描述 力扣https://leetcode.cn/problems/Ygoe9J/ 给定一个无重复元素的正整数数组 candidates 和一个正整数 target &#xff0c;找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。 candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同…

【容器起不来~tomcat】

记录一次线上容器~tomcat起不来的场景: **部门由于资金有限,只能用tomcat去部署,话不多说直接贴图: Docker 镜像 Tomcat 启动失败– 查看线上日志,日志报错了,报错内容如下: 1,Error response from daemon: driver failed programming external connectivityon endpoint jen…

离线安装ffmpeg源码包【详细教程】

今天分享一下ffmpeg源码包的安装过程&#xff0c;针对在没有网络环境下&#xff0c;且不能直接使用yum如何成功安装ffmpeg源码包。博主本人通过正式服务器测试&#xff0c;记录整个安装过程。值得大家收藏 同时&#xff0c;我会分享一下如何使用ffmpeg对H.264格式视频(MP4)进行…

ss客服让您在Facebook 的客户服务更便捷

ss客服让您在Facebook Messenger 的客户服务更便捷 在这个信息时代&#xff0c;新兴通讯软件蓬勃兴起&#xff0c;比如Facebook Messenger。事实证明&#xff0c;这对企业来说非常有利&#xff0c;同时突出了电子邮件、网络聊天和电话等传统渠道的局限性。在传统渠道上&#xf…

PostGIS(2):PostGreSQL数据库空间扩展模块安装

正式开始解读PostGIS 3.1.10文档之前&#xff0c;我们还是先简单叙述一下如何安装PostGIS。 从引言篇已经了解到&#xff1a;PostGIS是对象关系型数据库PostGreSQL的一个拓展模块。既然如此&#xff0c;我们必须先安装PostGreSQL数据库&#xff08;详细教程可参考&#xff1a;P…

Cocos2dx学习笔记:浅谈游戏内的适配方案

前言 本篇在讲什么 Cocos2dx中的适配方案 本篇适合什么 适合初学Cocos的小白 本篇需要什么 对Lua语法有简单认知 依赖Cocos2dx3.15环境 依赖Sublime Text编辑器 依赖VS 2015编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手…

【软件测试】盘一盘工作中遇到的 Redis 异常测试

目录 前言&#xff1a; 一、更新 Key 异常 二、Key的删除和丢失 三、KEY 过期策略不当造成内存泄漏 四、查询Redis异常时处理 五、redis 穿透、击穿、雪崩 六、Redis死锁 七、Redis持久化 八、缓存与数据库双写时的数据一致性 前言&#xff1a; 在软件测试过程中&…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…

计算机组成原理实验一:一位逻辑门构建

目录 一、实验目的 二、实验设备 三、实验原理 四、实验内容 1.一位非门 2.一位与门 3.一位或门 4.一位复用器 5.一位多路选择器 五、实验习题 如果只使用或非门搭建与、或和非门&#xff0c;该如何设计各芯片的物理结构&#xff1f; 六、自主设计——采用与或非门…

Word表格设置边框不生效的解决方法

1、这是新建并随意设置的表格&#xff0c;可以看出来上边框、内边框和下边框都是不同的粗细&#xff0c;很不协调。 2、选中表格&#xff0c;然后右击——>表格属性——>边框和底纹。 3、三线表&#xff0c;一般上边框和下边框都是1磅&#xff0c;内边框是0.5磅&#xff…

SpringSecurity对CSRF的支持实践

【1】什么是CSRF 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操…