数据结构—排序算法(插入排序及选择排序)

news2024/11/13 14:36:26

目录

1、排序的概念

2、常见的排序算法

3、直接插入排序(插入排序)

3.1 直接插入排序基本思想

3.2 直接插入排序实现

4、 希尔排序( 缩小增量排序 )(插入排序)

4.1 基本思想

4.2 希尔排序实现

 4.3 希尔排序的特性总结

5、直接选择排序(选择排序)

5.1 直接选择排序基本思想

5.2 直接选择排序实现

6、堆排序(选择排序)

6.1 堆排序的基本思想

6.2 堆排序实现

选择排序的特性总结


1、排序的概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。

稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。

内部排序:数据元素全部放在内存中的排序。

外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

2、常见的排序算法


3、直接插入排序(插入排序)

3.1 直接插入排序基本思想

直接插入排序是一种简单的插入排序法,其基本思想是:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 。

实际中我们玩扑克牌时,就用了插入排序的思想。

3.2 直接插入排序实现

当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与 array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移

//插入排序
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	{
		//[0,end]有序,把end+1位置的值插入,保持有序
		int end = i; 
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

直接插入排序的特性总结:

  • 1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  • 2. 时间复杂度:O(N^2)
  • 3. 空间复杂度:O(1),它是一种稳定的排序算法
  • 4. 稳定性:稳定

4、 希尔排序( 缩小增量排序 )(插入排序)

4.1 基本思想

希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工 作。当到达=1时,所有记录在统一组内排好序。

4.2 希尔排序实现

void ShellSort(int* a, int n)
{
	//gap > 1 时,是预排序
	//gap 最后一次等于一,是直接插入排序
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;

		for (int i = 0; i < n - gap; ++i)
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

  • 排升序,gap越大,大的数更快到后面,小的数可以更快到前面,但是越不接近有序
  • 排升序,gap越小,越接近有序
  • 当gap == 1,就是直接插入排序  

 4.3 希尔排序的特性总结

1. 希尔排序是对直接插入排序的优化。

2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些书本中给出的希尔排序的时间复杂度都不固定

                                《数据结构(C语言版)》--- 严蔚敏

                《数据结构-用面相对象方法与C++描述》--- 殷人昆

 4. 稳定性:不稳定

5、直接选择排序(选择排序)

5.1 直接选择排序基本思想

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的 数据元素排完 。

5.2 直接选择排序实现

  • 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素
  • 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换
  • 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素
//选择排序
void SelectSort(int* a, int n)
{
	assert(a);
	int begin = 0,end = n - 1;
	while (begin < end)
	{
		int mini = begin, maxi = begin;
		for (int i = begin + 1; i <= end; ++i)
		{
			if (a[i] < a[mini])
			{
				mini = i;
			}
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
		}
		swap(&a[begin], &a[mini]);
		if (begin == maxi)
		{
			maxi = mini;
		}
		swap(&a[end], &a[maxi]);
		++begin;
		--end;
	}
}

直接选择排序的特性总结:

1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

6、堆排序(选择排序)

6.1 堆排序的基本思想

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是 通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

6.2 堆排序实现

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

}



void HeapSort(int* a, int n)
{
	//建堆方式 1
		//从第二层第一个节点,向上调整
		//for (int i = 1; i < n; ++i)
		//{
		//	AdjustUp(a, i);
		//}
		//建堆方式 2
		//从第一个非叶子节点,向下调整
		//向下调整的前提,左右子树必须是堆
	for (int i = (n - 2) / 2; i >= 0; i--)
	{
		AdjustDown(a, n, i);
	}

	// O(N*log N)
	int end = n - 1;
	while (end > 0)
	{
		swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		end--;
	}

选择排序的特性总结

1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N*logN)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

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

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

相关文章

【Draw.io】让Draw.io导出的SVG格式图片包含自定义属性信息

前景提要 Draw.io重度用户一枚 这个Draw.io是一个极其好用的跨平台流程图绘制软件。 它保存的文件格式可以输出成SVG格式. 这个是基本功能了&#xff0c;没啥好说的 导出之后得到画的图片的SVG代码 SVG代码&#xff0c;也没啥好说的&#xff0c;一种矢量图片格式。 但是&…

改造Springboot+vue项目

准备 搜索一个项目&#xff0c;并成功运行 毕设时&#xff0c;我们可以从网上搜索一个项目&#xff08;包括前端的页面、后台的处理、数据库等有一下简单的模板样式&#xff09;并能成功的将项目在自己的电脑上跑起来。毕设项目可以用搜索的模板&#xff08;不用从头开始写&a…

【数据结构】_2.包装类与泛型

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 &#xff08;自动&#xff09;装箱和&#xff08;自动&#xff09;拆箱 1.2.1 装箱与拆箱 1.2.2 自动装箱与自动拆箱 1.3 valueOf()方法 2. 泛型类 2.1 泛型类与Object类 2.2 泛型类语法 2.3 泛型类示例 2.4 裸类…

怎么把照片缩小到200k?图片指定大小压缩怎么弄?

平时在给账号设置头像时&#xff0c;都会遇到图片过大无法上传的情况&#xff0c;这时候我们可以通过图片压缩指定大小工具来将图片压缩到200kb以下&#xff0c;这样就可以顺利设置头像了&#xff0c;下面一起来看一下图片指定大小压缩&#xff08;https://www.yasuotu.com/ima…

机器学习笔记 - windows基于TensorRT的UNet推理部署

一、TensorRT简介 NVIDIA TensorRT是一个用于高性能深度学习推理的平台。TensorRT适用于使用CUDA平台的所有NVIDIA GPU。所以如果需要基于TensorRT部署,至少需要一个NVIDIA显卡,算力5.0以上,比Maxwell更新的架构,可以参考下表。 CUDA GPUs - Compute Capability | NVIDIA …

电动车头盔检测数据集

现在正慢慢整理自己有关电动车头盔检测的项目内容&#xff0c;会逐渐将这些资源进行发布&#xff0c;供大家参考和使用【部分资源有偿提供&#xff0c;毕竟花费了很多心血】。 这篇文章主要是发布相关数据集的。网上关于工厂环境下的头盔数据集有很多&#xff0c;而且多种多样…

PFCdocumentation_Coupling PFC and FLAC3D

目录 Coupling PFC and FLAC3D 1D Structural Element Coupling Scheme Wall-Zone Coupling Scheme 2D 3D Ball-Zone Coupling Scheme Commands FISH Functions Coupling PFC and FLAC3D 在 FLAC3D 图形用户界面中&#xff0c;可以通过“工具 ‣ 加载 PFC”菜单项加载 …

计算机组成与结构易错题

计算机组成与结构 海明校验码是在n个数据位之外增设k个校验位&#xff0c;从而形成一个kn位的新的码字&#xff0c;使新的码字的码距比较均匀地拉大。n与k的关系是&#xff08;A&#xff09;。 A、2k-1≥nk B、2n-1≤nk C、nk D、n-1≤k 知识&#xff1a; 确定要传输的信息&…

普通专科生,拿什么拯救自己的未来我想成为一名网络安全专业人员,需要做什么?

前 言 写这篇文章的初衷是很多朋友都想了解如何入门/转行网络安全&#xff0c;实现自己的“黑客梦”。文章的宗旨是&#xff1a; 1.指出一些自学的误区 2.提供客观可行的学习表 3.推荐我认为适合小白学习的资源.大佬绕道哈&#xff01; 我的经历&#xff1a; 我19年毕业&…

【C语言】入门必看之循环练习(含二分查找动图)

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 ⚡注&#xff1a;此篇文章的 代码风格部分 将根据《高质量 C/C 编程指南》 —— 林锐 进行说明。该部分将用紫色表示 该篇将对循环语…

AI落地:10分钟变身Excel高手

本文首发公众号突围一只鹰。 使用Excel的时候经常有几个难点&#xff1a; 有些功能不知道如何操作不知道该用哪个公式不知道公式的参数如何设置复杂数据处理不知道如何写公式多表链接的时候不知道如何写公式其他数据源导入Excel只会手动录入 有了ChatGPT之后&#xff0c;很多…

求爷爷告奶奶,阿里大佬才甩出这份Spark+Hadoop+中台实战pdf

Spark大数据分析实战 1、Spark简介 初识Spark Sp ark生态系统BDAS Sp ark架构与运行逻辑 弹性分布式数据集 2、Spark开发与环境配置 Spark应用开发环境2置 使用Intelli i开发Spark 远程调试Spark程序 Spark编译 配置Spark源码阅读环境 3、BDAS简介 SQL on Spark S…

Windows使用flask部署HTML网页的方法

使用Flask python运行设计的好的html网页&#xff0c;已经配套的css和js文件&#xff1a; 前提条件 html、css 和 js 在同一个目录之下 html 内使用 css 和 js &#xff0c;需要使用相对路径flask python 程序可以和 html 不在同一个目录 即&#xff1a;python程序可以在D盘…

sql server 数据库

1、窗口函数 sqlserver中窗口函数和OVER()函数_lfw2019的博客-CSDN博客参考&#xff1a;https://blog.csdn.net/qq_41805514/article/details/81772182 https://blog.csdn.net/qq_27997957/article/details/82383328一、OVER() 函数  语法结构&#xff1a;OVER([ PARTITION B…

【C++初阶】动态内存管理

一.C内存分布 说明&#xff1a; 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的&#xff1b; 2. 内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存&#xff0c;做进程间通信&…

【Leetcode刷题】算法:合并两个有序链表

文章目录 一、题目介绍二、解决办法三、提交结果 一、题目介绍 二、解决办法 首先定义一个名为ListNode的类&#xff1a; class ListNode:def __init__(self, val0, nextNone):self.val valself.next nextListNode代表一个链表节点&#xff0c;每个节点包含一个值&#xff…

【python】给你女神制作一个520图片墙吧~

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 环境使用 所需软件&#xff1a; Python 3.8 解释器 Pycharm 编辑器 模块使用&#xff1a; 内置模块 import re >>> python独有的匹配字符串的模块&#xff0c;该模块种提供功能基于正则表达式实现的&#xff0c…

六级备考28天|CET-6|听力第一讲|基本做题步骤与方法|13:30~14:30

目录 1. 重点词汇 proofread / ˈpruːfriːd / v.校对&#xff0c;校阅 autonomous adj.独立的 obsession n. 喜好 ample …

网络安全的学习路线

在众多高大上的学习路线指导中&#xff0c;尝试做一股清流&#xff0c;把要讲清楚的都讲清楚&#xff0c;该学些什么&#xff0c;学到哪个程度进入到下一阶段的学习这些才是最重要的。 在学习之前首先要做好学习的系统规划&#xff1a; 1.目前市场需求主流的岗位里&#xff0…

vue3+ts+wangEditor5菜单栏添加自定义图标按钮,自定义弹出界面内容,自定义插入链接 五步走

Wangeditor安装&#xff1a;VUE3的安装 &#xff0c;其它看官网&#xff1a; npm install wangeditor/editor --save npm install wangeditor/editor-for-vuenext --save 官网&#xff1a;优势 | wangEditor 官方插入自定义内容样例&#xff1a; https://github.com/wange…