数据结构排序(一.基本概念、插入排序和希尔排序实现)

前段时间也是结束了二叉树的知识梳理(大家想必满脑子都是递归了):二叉树链式结构的实现(二叉树的遍历以及各种常用功能函数的实现)
今天也要迈向全新的篇章了——排序。这次就先大概讲解一下排序,然后插入排序和希尔排序的介绍和实现


文章目录

  • 1.排序的概念和运用
    • 1.1概念
    • 1.2运用
  • 2.常见排序一览
  • 3.直接插入排序
    • 3.1基本思想
    • 3.2具体实现
    • 3.3过程示图
  • 4.希尔排序
    • 4.1思想、过程和性质
    • 4.2代码实现


1.排序的概念和运用

1.1概念

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减(升序或降序)的排列起来的操作。对于排序算法,稳定性是一个重要的特性。

稳定性:描述了相同键值的元素在排序前后相对位置是否保持不变,即在原序列中,有r[i]=r[j],且r[i]在r[j]之前(i<j),而在排序后的序列中,r[i]仍在r[j]之前(次序保持不变),则称这种排序算法是稳定的;否则称为不稳定的

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

外部排序:数据元素太多,无法一次性放入内存中,因此排序过程需要借助外部存储空间进行处理,根据排序过程的要求不能在内外存之间移动数据的排序

1.2运用

  1. 邮件和文件整理: 在办公室或个人生活中,整理文件或邮件时会按照日期、主题或重要性排序,这样可以更方便地管理和查找文件

请添加图片描述

  1. 成绩、学校排名:我们作为学生那肯定很熟悉了
  2. 音乐播放列表: 在音乐播放器或流媒体平台上,可以按照歌手、专辑、曲目或流行程度等因素对音乐进行排序,方便用户查找和播放喜欢的音乐

2.常见排序一览

请添加图片描述


3.直接插入排序

3.1基本思想

直接插入排序:它的基本思想是将待排序序列分为已排序未排序两部分,然后逐步将未排序部分的元素插入到已排序部分的合适位置,最终完成整个序列的排序

打扑克牌时,我们不就这样吗

请添加图片描述

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

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

3.2具体实现

void InsertionSort(int* a, int n)//升序
{
	for (int i = 0; i <= n - 2; i++)
	{
		int end = i;//用来标记,<=end的都已经排好了,该end+1排了
		int tmp = a[end + 1];//保存一下,后面可能会被覆盖
		while (end >= 0)//用来把比tmp大的向后移,中间就有空位了
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];//要是>tmp那就向后移动,也是覆盖发生
			}
			else
			{
				break;
			}
			end--;//end往前走
		}
		a[end + 1] = tmp;//放到空位,
	}

}

int main()
{
	int a[10] = { 2,5,6,1,8,9,10,12,56,73 };
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	InsertionSort(a, 10);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

请添加图片描述

3.3过程示图

请添加图片描述


4.希尔排序

4.1思想、过程和性质

gap为间隔,隔几个间隔取一个元素放在同一个子序列内。

希尔排序:一种插入排序的改进版本,也被称为缩小增量排序。它通过将待排序的数组分割成若干个子序列,分别进行插入排序,然后逐步减小子序列的长度,最终将整个数组排序。当子序列长度到达1时,所有记录就排好序了(gap=1时就是插入排序了)

步骤:

  1. 选择一个增量序列(gap),通常为n/2、n/4、n/8…直到增量为1。

  2. 根据增量(gap,gap多大就能分几组)将数组分割成若干个子序列,对每个子序列进行插入排序(gap为t,一共n个数据。能分t组:每隔t个就取一个)

  3. 逐步减小增量,重复上述步骤,直到增量为1,此时对整个数组进行插入排序

请添加图片描述

这只是gap=3的过程,gap会继续减小再次经历次过程。直至gap=1是最后一次

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就

会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。

  1. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算
  2. 稳定性:不稳定(分组在不同组,导致改变)

4.2代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)//最外层循环用来减小gap
	{
		gap = gap / 3 + 1;//保证最后一个gap=1;1或2来除3是0
		for (int i = 0; i < n - gap; i++)//第二层循环用来使整个数组以子序列为单位进行插入排序
		{
			int end = i;//需要end最初指向各子序列的头
			int tmp = a[end + gap];//储存下一个需要排的
			while (end >= 0)//第三次循环是针对这个tmp,看插在哪内进行插入排序(找空位)
			{
				if (tmp < a[end])
				{
					a[end + gap] = a[end];//end处的值后移到子序列中的下一个
					end-=gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;//放进空位
		}


	}
}

int main()
{
	int a[] = { 9,1,2,5,7,4,8,6,3,5,1,2,3,5,1,8,3 };
	printf("排序前:");
	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	ShellSort(a, sizeof(a) / sizeof(int));
	printf("排序后:");
	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
	return 0;
}

结果:

请添加图片描述


这次排序就先起个头,下次接着带来选择排序的内容,感谢大家支持!!!

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

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

相关文章

R304S 指纹识别模块功能实现示例

1 基本通信流程 1.1 UART 命令包的处理过程 1.2 UART 数据包的发送过程 UART 传输数据包前&#xff0c;首先要接收到传输数据包的指令包&#xff0c;做好传输准备后发送成功应答包&#xff0c;最后才开始传输数据包。数据包主要包括&#xff1a;包头、设备地址、包标识、包长…

Spring IOC的四种手动注入方法

手动注入 1.Set方法注入-五种类型的注入1.1 业务对象JavaBean第一步&#xff1a;创建dao包下的UserDao类第二步&#xff1a;属性字段提供set⽅法第三步&#xff1a;配置⽂件的bean标签设置property标签第四步&#xff1a;测试 1.2 常用对象String&#xff08;日期类型&#xff…

【AI视野·今日CV 计算机视觉论文速览 第282期】Wed, 3 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Wed, 3 Jan 2024 Totally 70 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Street Gaussians for Modeling Dynamic Urban Scenes Authors Yunzhi Yan, Haotong Lin, Chenxu Zhou, Weijie Wang, Haiya…

togaf 9.2中文版

尊敬的读者朋友们&#xff0c;本专栏为togaf 9.2 的个人学习笔记&#xff0c;我会尽量将信息完整地传递给大家&#xff0c;以便更多对 togaf 感兴趣的朋友不用花费巨资去购买相关资料。本文档不需要读者具备企业架构的预备知识。 专栏受众&#xff1a;企业架构师、业务架构师、…

Android WiFi 连接

Android WiFi 连接 1、设置中WiFi显示2、WiFi 连接流程2.1 获取PrimaryClientModeManager2.2 ClientModeImpl状态机ConnectableState2.3 ISupplicantStaNetworkCallback 回调监听 3、 简要时序图4、原生低层驱动5、关键日志 1、设置中WiFi显示 Android WiFi基础概览 packages/a…

阿里云服务器可用区是什么?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

天津最新web前端培训班 如何提升web技能?

随着互联网的迅猛发展&#xff0c;web前端成为了一个热门的职业方向。越来越多的人希望能够通过学习web前端技术来提升自己的就业竞争力。为了满足市场的需求&#xff0c;许多培训机构纷纷推出了web前端培训课程。 什么是WEB前端 web前端就是web给用户展示的东西&#xff0c;…

DataFunSummit:2023年知识图谱在线峰会-核心PPT资料下载

一、峰会简介 AIGC&#xff0c;ChatGPT以及发布的GPT-4相信已经给大家带来足够的冲击&#xff0c;那么对于知识图谱的应用产生哪些变化和变革&#xff1f;知识图谱在其中如何发挥作用呢&#xff1f;通过LLM是否有可能辅助创建通用大规模知识图谱&#xff1f;AIGC时代下行业知识…

http缓存

http缓存 header里缓存相关的属性 Expires 响应头,代表该资源的过期时间&#xff0c;在http1.0引入Cache-control 请求/响应头&#xff0c;可以配置缓存策略&#xff0c;在http1.1引入&#xff0c;与Expires同时存在时&#xff0c;优先使用Cache-controlIf-Modified-Since …

实现在一个文件夹中找到特定名称特点格式的文件

当你要在一个文件夹中查找特定名称和格式的文件时&#xff0c;你可以使用 Python 的 os 和 fnmatch 模块。以下是一个简单的脚本示例&#xff0c;它可以在指定目录中查找文件&#xff1a; import os import fnmatchdef find_files(directory, pattern):"""在指…

关于图像分割任务中按照比例将数据集随机划分成训练集和测试集

1. 前言 之前写了分类和检测任务划分数据集的脚本&#xff0c;三大任务实现了俩&#xff0c;基于强迫症&#xff0c;也实现一下图像分割的划分脚本 分类划分数据&#xff1a;关于图像分类任务中划分数据集&#xff0c;并且生成分类类别的josn字典文件 检测划分数据&#xff…

【IDEA】 解决在idea中连接 Mysql8.0,驱动无法下载问题

本篇继【idea】解决sprintboot项目创建遇到的问题2-CSDN博客 目录 一、Failed to download https://download.jetbrains.com/idea/jdbc-drivers/MySQL/8/LICENSE.txt:Remote host terminated the handshake 二、no dirver files provided com.mysql.cj.jdbc.Driver 三、Serv…

leetcode“位运算”——只出现一次的数字

只出现一次的数字i&#xff1a; https://leetcode.cn/problems/single-number/ 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<i…

flink table view datastream互转

case class outer(f1:String,f2:Inner) case class outerV1(f1:String,f2:Inner,f3:Int) case class Inner(f3:String,f4:Int) 测试代码 package com.yy.table.convertimport org.apache.flink.streaming.api.scala.StreamExecutionEnvironment import org.apache.flink.tabl…

强化学习的数学原理学习笔记 - 基于模型(Model-based)

文章目录 概览&#xff1a;RL方法分类基于模型&#xff08;Model-Based&#xff09;值迭代&#xff08;Value Iteration&#xff09;&#x1f7e6;策略迭代&#xff08;Policy Iteration&#xff09;&#x1f7e1;截断策略迭代&#xff08;Truncated Policy Iteration&#xff…

从新手到大师:四大编程范式解锁你的编码力!

编程&#xff0c;就是用代码跟计算机交流&#xff0c;告诉它我们想要它做什么。不同的编程范式就是不同的交流方式&#xff0c;每种方式都有自己独特的语法和规则。 今天&#xff0c;我们就来聊聊这四种主要的编程范式&#xff0c;它们分别是命令式、函数式、面向对象和声明式…

cube生成电机库,启用了RTOS,编译报错[0xc43ed8:5050106] in osSignalWait

cube生成电机库&#xff0c;启用了RTOS&#xff0c;编译报错[0xc43ed8:5050106&#xff0c;解决办法] in osSignalWait 1.现象 编译报错[0xc43ed8:5050106] in osSignalWait 导致链接失败 2.解决办法 将keil5的版本升级到5.18.00&#xff0c;我的版本也是5.14.00。

2024阿里云优惠活动有哪些?

2024年阿里云优惠活动大全&#xff0c;包括阿里云服务器优惠活动清单、配置价格表、域名优惠活动、阿里云建站活动、阿里云优惠代金券免费领取、对象存储OSS活动、企业邮箱优惠、无影云电脑优惠、CDN特惠等等&#xff0c;阿里云百科aliyunbaike.com分享2024阿里云优惠活动大全_…

Vue实现加减法验证码

引入Vue.js 在HTML文件的<head>标签中引入Vue.js的CDN链接&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.6.11/dist/vue.min.js"></script>创建Vue实例 接下来&#xff0c;我们要创建一个Vue实例&#xff0c;并将其挂载到HTML文…

用可视化案例讲Rust编程1. 怎么能学会Rust

用可视化案例讲Rust编程 1. 怎么能学会Rust 如果要列举Rust的优势&#xff0c;恐怕写个十条八条是写不完的&#xff0c;而且不管写哪条优势&#xff0c;都有很多同学跳起来反驳&#xff0c;比如我们说Rust比C/C内存安全&#xff0c;肯定有同学说C 20也支持内存安全&#xff0…