【排序,直接插入排序 折半插入排序 希尔插入排序】

文章目录

  • 排序
    • 排序方法的分类
    • 插入排序
      • 直接插入排序
      • 折半插入排序
      • 希尔插入排序

排序

将一组杂乱无章的数据按照一定规律排列起来。将无序序列排成一个有序序列。

排序方法的分类

储存介质:

  • 内部排序:数据量不大,数据在内存,无需内外存交换数据。
  • 外部排序:数据量较大,数据在外存(文件排序)。

比较器个数:

  • 串行排序:单处理机(同一时刻比较一对元素)。
  • 并行排序:多处理机(同一时刻比较多对元素)。

主要操作:

  • 比较排序:用比较的方法。
    插入排序,交换排序,选择排序,归并排序
  • 基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置。

辅助空间:

  • 原地排序:辅助空间用量为O(1)的排序方法。
  • 非原地排序:辅助空间用量超过O(1)的排序方法。

稳定

  • 稳定排序
  • 非稳定排序

插入排序

直接插入排序

前提是数组中的元素是有序的。
在这里插入图片描述

#include<stdio.h>void PrintArr(int arr[],int l);
void InsertSort(int arr[], int l);//#define MAXSIZE 20	//设记录的值不超过20个
//#define  KeyType int//设关键字为整型量
//#define InfoType int //定义InfoType的其他数据项
//
//
//typedef struct {
//	KeyType key;//定义每个记录(数据元素)的结构
//	InfoType otherinfo;//其他数据项
//}RedType;
//
//typedef struct SqList {
//	RedType r[MAXSIZE + 1];//存储顺序表的结构
//						//r[0]一般做哨兵或者缓冲区
//	int length;//顺序表的长度
//}SqList;
//
//void InsertSort(SqList S) {
//	int i, j;
//	for (i = 2; i < S.length; i++) {
//		if (arr[i]  < arr[i - 1] ) {
//			arr[i]  = arr[0] ;
//		
//		for (j = i - 1; arr[j]  > arr[0] ; j--) {
//			arr[j + 1] = arr[j];//j的值都要依次向后移,进行插入
//		}
//		arr[j+1]  = arr[0] ;//这里直接将哨兵的值赋值给当前查出来正确的位置
//		}
//	}
//}void InsertSort(int arr[], int l) {int i = 0, j;int temp;printf("请输入要插入的数:");scanf_s("%d", &temp);arr[i] = temp;for (i = 2; i < l; i++) {if (arr[i] < arr[i - 1]) {arr[i]  = arr[0] ;for (j = i - 1; arr[j]  > arr[0] ; j--) {arr[j + 1] = arr[j];//j的值都要依次向后移,进行插入}arr[j+1]  = arr[0] ;//这里直接将哨兵的值赋值给当前查出来正确的位置}}PrintArr(arr, l);
}void PrintArr(int arr[],int l) {int i;for (i = 1; i <= l; i++) {printf("%d ", arr[i]);}
}int main() {int arr[10] = { 1,2,3,4,5,6,7,14, 12};InsertSort(arr,10);return 0;
}

折半插入排序

查找插入位置时采用折半查找法。
在这里插入图片描述

void BInsert(SqList &S) {int i, j,low,high,mid;for (int i = 2; i <= S.length; i++) {if (S.r[i].key < S.r[i - 1].key) {S.r[i] = S.r[0];low = 1, high = i - 1;while (low <= high) {mid = (low + high) / 2;if (S.r[0].key <S.r[mid].key) {high = mid - 1;}else {high = mid + 1;}}for (j = i - 1; j < high + 1; j--) {S.r[j - 1] = S.r[j];S.r[high + 1] = S.r[0];}}}
}

折半插入排序—算法分析

  • 折半查找比顺序查找要快,所以折半插入排序就平均性能来说比直接插入排序要快;
  • 他所需要的关键码比较次数与待排序对象序列排列无关,仅依赖于对象个数,在插入第i个对象时,需要经过在这里插入图片描述次关键码比较,才能确定它应该插入的位置。
  • 折半查找减少了比较次数,但没有减少移动次数。
  • 平均性能优于直接插入排序。
  • 时间复杂度为O(n的平方)。
  • 空间复杂度为O(1)。
  • 是一种稳定的排序方法。

希尔插入排序

在这里插入图片描述

希尔排序的特点:

  1. 一次移动,移动位置较大,跳跃式地接近排序后的最终位置。
  2. 最后一次只需少量移动
  3. 增量序列必须是递减的,最后一个必须是1.
  4. 增量序列应该是互质的。
//希尔排序
void ShellInsert(SqList& L, int dk) {//对顺序表L进行一趟增量为dk的Shell排序,dk为增长因子int i,j;for (i = dk + 1; i <= L.length; ++i) {if (L.r[i].key < L.r[i - dk].key) {L.r[0] = L.r[i];for (j = i - dk; j > 0 && (L.r[0].key < L.r[j].key); j = j - dk) {L.r[j - dk] = L.r[j];}L.r[j + dk] = L.r[0];			}}
}void ShellSort(SqList& L, int dlta[], int t) {//按增量序列dlta[0..t-1]对顺序表L进行希尔排序for (int k = 0; k < t; k++) {ShellInsert(L, dlta[k]);//一趟增量为dlta[k]的插入排序}
}

希尔排序算法分析
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 18. 四数之和(优质解法)

代码&#xff1a; class Solution {public List<List<Integer>> fourSum(int[] nums, int target) {List<List<Integer>> listsnew ArrayList<>();int lengthnums.length;Arrays.sort(nums);for(int i0;i<length-4;){for(int ji1;j<lengt…

【ArcGIS Pro二次开发】:CC工具箱1.1.4更新_免费_50+工具

CC工具箱1.1.4更新【2023.11.30】 使用环境要求&#xff1a;ArcGIS Pro 3.0 一、下载链接 工具安装文件及使用文档&#xff1a; https://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5rhttps://pan.baidu.com/s/1OJmO6IPtMfX_vob3bMtvEg?pwduh5r 二、使用方法 1、在下…

抖音本地生活服务商申请条件

抖音的本地生活服务商目前有两种&#xff0c;一种是可以做全国的服务商&#xff0c;我们一般叫抖音本地生活服务商&#xff0c;一种是区域优待服务商&#xff0c;也就是后面出来的服务商&#xff0c;这两种服务商的申请方式大同小异。 相同的地方就是都需要给平台交保证金。抖…

Go语言 值传递

官方说法&#xff0c;Go中只有值传递&#xff0c;没有引用传递 而Go语言中的一些让你觉得它是引用传递的原因&#xff0c;是因为Go语言有值类型和引用类型&#xff0c;但是它们都是值传递。 值类型 有int、float、bool、string、array、sturct等 引用类型有slice&#xff0c…

FlatLaf:干净、优雅、扁平化,基于java swing现代开源跨平台外观

一个很不错的java swing ui库&#xff0c;idea主题风格&#xff0c;还能自定义 FlatLaf是用于JavaSwing 桌面应用程序的现代开源跨平台外观。 它看起来几乎是平的&#xff08;没有阴影或渐变&#xff09;、干净、简单和优雅。FlatLaf带有Light、Dark、IntelliJ和Darcula主题&a…

11 款顶级的免费 iPhone 数据恢复软件

iPhone 拥有巨大的存储容量。您可以在 iPhone 设备上存储图像、文档和视频等数据。有时&#xff0c;您的 iPhone 会发生许多意外事件&#xff0c;例如意外删除&#xff0c;从而导致数据丢失。这里有 11 个最好的免费 iPhone 数据恢复软件&#xff0c;您可以免费下载&#xff0c…

[架构之路-255]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件架构风格

前言&#xff1a; 风格是指在不同领域内&#xff0c;人们在表达自己的过程中&#xff08;如艺术、音乐、文化、时尚、建筑、软件系统等&#xff09;&#xff0c;所选择的、相对稳定的表达方式和特征的总和。在不同领域内都存在着多种不同的风格。 在艺术领域内&#xff0c;也…

zabbix分布式监控平台从IPV4切换到IPV6之监控主机切换

现在有一套监控了海量服务器的zabbix分布式监控平台需整体在线从IPV4切换到IPV6&#xff0c;不能影响其原有的定制监控及视图。本文讲解了切换的第一步--监控主机切换。 一、zabbix分布式监控平台平台架构 本套zabbix分布式监控平台是一个多代理服务器分布式部署的典型传统架构…

和鲸科技与国科环宇建立战略合作伙伴关系,以软硬件一体化解决方案促进科技创新

近日&#xff0c;在国科环宇土星云算力服务器产品发布会暨合作伙伴年度会上&#xff0c;和鲸科技与国科环宇正式完成战略伙伴签约仪式&#xff0c;宣布达成战略合作伙伴关系。未来&#xff0c;双方将深化合作&#xff0c;充分发挥在产品和市场方面的互补优势&#xff0c;为企事…

Pycharm配置jupyter使用notebook详细指南(可换行conda环节)

本教程为事后记录&#xff0c;部分图片非实操图片。 详细记录了pycharm配置jupyter的方法&#xff0c;jupyter添加其他conda环境的方法&#xff0c;远程密码调用jupyter的方法&#xff0c;修改jupyter工作目录的方法。 文章目录 一、入门级配置1. Pycharm配置Conda自带的jupyt…

Goby 漏洞发布| CrushFTP as2-to 认证权限绕过漏洞(CVE-2023-43177)

漏洞名称&#xff1a; CrushFTP as2-to 认证权限绕过漏洞&#xff08;CVE-2023-43177&#xff09; English Name&#xff1a;CrushFTP as2-to Authentication Permission bypass Vulnerability (CVE-2023-43177) CVSS core: 9.8 影响资产数&#xff1a; 38695 漏洞描述&…

C语言贪吃蛇(有详细注释)

这个贪吃蛇是在比特特训营里学到的&#xff0c;同时我还写了用EasyX图形库实现的图形化贪吃蛇&#xff0c;含有每个函数的实现以及游戏中各种细节的讲解&#xff0c;感兴趣的可以去看一看。 贪吃蛇小游戏 实现效果 以下就是源码&#xff0c;感兴趣的小伙伴可以cv自己玩一玩改…