【CPP】插入排序:直接插入排序、希尔排序

news2024/12/24 21:01:37

目录

  • 1.插入排序
    • 1.1直接插入排序
      • 简介
      • 代码
      • 分析
    • 1.2直接插入对比冒泡排序
      • 简介
      • 代码
      • 对比分析(直接插入排序与冒泡的复杂度效率区别)
    • 1.3希尔排序
      • 简介
      • 代码
      • 分析

1.插入排序

基本思想:把一个待排数字按照关键码值插入到一个有序序列中,得到一个新的有序序列。

1.1直接插入排序

简介

直接插入排序即是直接把一个待排数字插入一个有序序列的这种插入排序方法。

这类似于打牌时插排的情况:
在这里插入图片描述

请添加图片描述

我们写直接插入排序应该先写好单趟插入排序再写完整体的插入排序。

代码

我们假设要排升序。
且假设[0,end]有序,让end+1的数字插入到有序序列当中。

单趟插入排序:
直接插入排序的单趟存在下面两种情况:
在这里插入图片描述
每个数的插入:
在这里插入图片描述

完整插入排序:
我们由单趟直接插入排序扩展到多趟的插入排序。
在这里插入图片描述

问:数组位置0处可以存数据个数吗?
特殊情况下可以,但是不建议。
在这里插入图片描述

分析

最坏情况:O(N^2)
最好情况:O(N)

结论:直接插入排序适合基本有序的序列排序,不适合逆序排序。
插入排序在基本有序的情况下,时间复杂度接近O(N),因而直接插入排序比较适合于基本有序的序列排序。
但是,一旦碰到逆序的序列,时间复杂度直接到了O(N^2)。

1.2直接插入对比冒泡排序

与直接插入排序相似思路的是冒泡排序

简介

略。
在这里插入图片描述

代码

在这里插入图片描述

对比分析(直接插入排序与冒泡的复杂度效率区别)

最好的时间复杂度:O(N)
最差的时间复杂度:O(N^2)
冒泡排序与直接插入排序是一个量级的。但是仍然还有一些细微区别:

void TestOP()
{
	srand(time(0));
	const int N = 10000;
	int* a1 = (int*)malloc(sizeof(int) * N);
	int* a2 = (int*)malloc(sizeof(int) * N);
	int* a3 = (int*)malloc(sizeof(int) * N);
	int* a4 = (int*)malloc(sizeof(int) * N);
	int* a5 = (int*)malloc(sizeof(int) * N);
	int* a6 = (int*)malloc(sizeof(int) * N);
	int* a7 = (int*)malloc(sizeof(int) * N);

	for (int i = 0; i < N; ++i)
	{
		a1[i] = rand();
		a2[i] = a1[i];
		a3[i] = a1[i];
		a4[i] = a1[i];
		a5[i] = a1[i];
		a6[i] = a1[i];
		a7[i] = a1[i];
	}

	int begin1 = clock();
	insertSort(a1, N);
	int end1 = clock();

	int begin2 = clock();
	//ShellSort(a2, N);
	int end2 = clock();

	int begin3 = clock();
	//SelectSort(a3, N);
	int end3 = clock();

	int begin4 = clock();
	//HeapSort(a4, N);
	int end4 = clock();

	int begin5 = clock();
	//QuickSort(a5, 0, N - 1);
	int end5 = clock();

	int begin6 = clock();
	//MergeSort(a6, N);
	int end6 = clock();

	int begin7 = clock();
	bubbleSort(a7, N);
	int end7 = clock();

	printf("InsertSort:%d\n", end1 - begin1);
	printf("ShellSort:%d\n", end2 - begin2);
	printf("SelectSort:%d\n", end3 - begin3);
	printf("HeapSort:%d\n", end4 - begin4);
	printf("QuickSort:%d\n", end5 - begin5);
	printf("MergeSort:%d\n", end6 - begin6);
	printf("BubbleSort:%d\n", end7 - begin7);

	free(a1);
	free(a2);
	free(a3);
	free(a4);
	free(a5);
	free(a6);
	free(a7);
}

在这里插入图片描述

为什么会造成这种差异呢?
原因在于,冒泡排序每次单趟一定走n-1-i次(假设这是第i趟排序)。
但是,直接插入排序每次单趟一定小于或者等于走n-1-i次(假设这是第i趟排序),只有逆序情况下才与冒泡等价。

1.3希尔排序

简介

希尔排序就是先进行预排序,再进行排序的插入排序。

  • 预排序(让序列接近有序)
  • 直接插入排序

代码

在这里插入图片描述

在这里插入图片描述

分析

希尔排序时间复杂度是O(N^1.3)


EOF

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

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

相关文章

Python学习笔记19:进阶篇(八)常见标准库使用之glob模块和argparse模块

前言 本文是根据python官方教程中标准库模块的介绍&#xff0c;自己查询资料并整理&#xff0c;编写代码示例做出的学习笔记。 根据模块知识&#xff0c;一次讲解单个或者多个模块的内容。 这里贴一下教程地址&#xff1a;https://docs.python.org/zh-cn/3/tutorial/stdlib.h…

执行shell脚本出现 $‘ \r‘ 符号导致执行失败【解决】

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

mprpc框架基础类的设计

目录 1.回顾 2.主函数书写 3.框架设计 3.1 mprpcapplication.h 3.2 rpcprovider.h 3.3 mprpcapplication.cc 3.4 mprpcprovider.cc 1.回顾 mprpc框架怎么用&#xff1f; 在上一节&#xff0c;我们完成了如何把本地服务发布成RPC服务。 我们打开example下callee下的users…

制造业ERP五大生产模式详解!

制造业面临着从成本控制、生产效率到供应链管理的挑战&#xff0c;每一个环节都需要精细化的管理和高效的协同。而ERP系统&#xff0c;作为一种集信息技术与管理思想于一体的管理工具&#xff0c;正逐渐成为制造业转型升级的关键。那么&#xff0c;通过本文你将会了解到&#x…

某某商场对账返款单,table

好久不写原生html&#xff0c;今天写了个&#xff0c;快忘完了 。。。 Double Header Table ***商场统一收银结算商户对账返款单 商场&#xff08;盖章有效&#xff09; 铺位名称&#xff1a; 铺位号&#xff1a; 制单人&#xff1a; 制单日期&#xff1a; </tr><tr&…

智慧社区:居民幸福生活的保底线,价值非常大。

大屏应该能够显示社区内的关键数据&#xff0c;如人流量、车辆数量、垃圾分类情况等。这些数据可以通过图表、数字、地图等形式展示&#xff0c;以便居民和管理者能够直观地了解社区的情况。 智慧社区可视化大屏成为一个有益于社区管理和居民生活的工具&#xff0c;提供实时、准…

北京互动阅读app开发,“身”临其境,阅读精彩

随着大数据与智能化的不断发展进步&#xff0c;线上阅读软件也越来越多&#xff0c;为了缓解对传统翻页阅读方式产生的疲劳&#xff0c;人们对线上阅读提出了新的要求。对此&#xff0c;与智能科技相结合的北京互动阅读app开发&#xff0c;以高互动、高体验感的优势&#xff0c…

Casaos之qittorrent设置(没有账号密码)

点击安装只有没有账号密码&#xff0c;只能从运行日志中找密码&#xff1a; # 查看container docker ps -a # 查看container日志 docker logs ae15cb90afbd 进入系统 最下方&#xff0c;保存。

solidity智能合约如何实现跨合约调用函数

背景 比如现在有一个需求、我需要通过外部合约获取BRC20 token的总交易量。那么我需要在brc20的转账函数里面做一些调整&#xff0c;主要是两个函数内统计转移量。然后再提供外部获取函数。 /*** dev Sets amount as the allowance of spender over the callers tokens.** Ret…

从SRE视角透视DevOps的构建精髓

SRE 侧重系统稳定性&#xff0c;DevOps 强调开发运维协作。SRE 实践助力DevOps&#xff0c;提升系统稳定性与团队协作效率。 SRE 运用软件工程的原理&#xff0c;将系统管理员的手工任务自动化&#xff0c;负责运维由系统组件构成的服务&#xff0c;确保服务稳定运行。SRE职责涵…

全国计算机等级考试WPS如何报名

全国计算机等级考试WPS如何报名&#xff1f; 注册并登录 全国计算机等级考试官网选择 考试服务-在线报名选择报考省份-开始报名

现成!小众且创新idea! 小样本+故障识别!1DGAN-SVM 批量生成样本-故障识别一体化程序!MATLAB程序,直接运行!

推荐平台&#xff1a;Matlab2022版及以上 在机器学习、深度学习领域&#xff0c;数据的多样性和数量直接影响模型的性能。生成对抗算法GAN&#xff08;Generative Adversarial Network&#xff09;通过对抗过程训练&#xff0c;能够生成高度逼真的数据样本&#xff0c;增加训练…

Verifieable FHE(VFHE):使用Plonky2来证明Zama TFHE的“Bootstrapping的正确执行”

1. 引言 Zama团队2024年论文Towards Verifiable FHE in Practice: Proving Correct Execution of TFHE’s Bootstrapping using plonky2 中&#xff1a; 首次阐述了&#xff0c;在实践中&#xff0c;将整个FHE bootstrapping操作&#xff0c;使用SNARK来证明。在其相应的http…

买卖的价差与速率之间建立的关系

import numpy as np import matplotlib.pyplot as plt# 参数设置 A 100 delta_ba np.array([1, 5, 10]) # 时间差&#xff0c;以秒为单位 k_values [0.05, 0.1, 0.01] # 不同的k值# 计算不同k值下的λb,a def calculate_lambda(A, k, delta):return A * np.exp(-k * delta…

NSSCTF-Web题目16

目录 [GDOUCTF 2023]受不了一点 1、题目 2、知识点 3、思路 [UUCTF 2022 新生赛]ez_upload 1、题目 2、知识点 3、思路 [GDOUCTF 2023]受不了一点 1、题目 2、知识点 php代码审计、数组绕过、弱比较绕过 3、思路 打开题目&#xff0c;出现代码&#xff0c;我们进行代…

AIGC已经火了好几年,现在学还抓得住这个风口吗?

简介 进入人工智能&#xff08;AI&#xff09;与游戏行业整合&#xff08;AIGC&#xff09;领域需要考虑当前的市场需求和行业发展阶段&#xff1a; 1、市场需求&#xff1a;目前&#xff0c;人工智能和游戏行业都在不断发展壮大&#xff0c;并且两者的结合也逐渐成为一个热门领…

当前周周报自动生成工具

周报自动生成工具使用指南 功能简介 每次只用在xx周报.xlsx 中进行工作内容的更改&#xff0c;然后写完之后点一下run\_clear\_formulas\_and\_save.bat就能导出一份当前周周报&#xff0c;不用进行每周都自己新建一份然后把所有需要改时间的地方都改一遍这种重复劳动。 自动…

C++三大特性之一:多态

一、多态 1、通过指针创建对象&#xff08;动态分配&#xff09; #include <iostream> using namespace std;class Base { public:virtual void show() {cout << "Base class show" << endl;} };class Derived : public Base { public:void show…

Android 13 修改系统导航默认值

Android 13 原生系统上&#xff0c;设置-系统-手势-系统导航 菜单&#xff0c;可以修改系统导航方式。 手势导航&#xff1a; 三按钮导航&#xff1a; adb 获取当前导航方式&#xff0c;手势导航 是 2 &#xff0c;三按钮导航是 0 。 settings get secure navigation_mode 修…

游戏AI的创造思路-技术基础-深度学习(2)

感觉坑越挖越大&#xff0c;慢慢填~~~~ 继续上篇进行填坑&#xff0c;这一篇我们介绍下循环神经网络 目录 3.2. 循环神经网络&#xff08;RNN&#xff09; 3.2.1. 算法形成过程 3.2.2. 运行原理 3.2.3. RNN有哪些优缺点 3.2.4. RNN参数 3.2.5. 如何选择RNN模型参数 3.2…