排序算法(冒泡,插入),希尔排序(插入升级),希尔排序和插入排序时间比较!

🎁个人主页:我们的五年

🔍系列专栏:排序算法

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

一.冒泡排序:

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

🏄‍♂️思路分析:

冒泡排序是交换排序。

第一次找出最大的放在数组的最后面num[n-1]。

第二次找出第二大的数放在数组的num[n-2]。

……

两两相比,然后交换位置就可以找到最大的,第二大的……

如果某趟中,没有进行数据交换,证明此时序列已经有序。就可以直接跳出循环。

🏄‍♂️代码分析:

//冒泡排序
void Bubble_Sort(int* num, int n)
{//n-1趟for (int i = 0;i <n -1; i++){bool flag = 0;//第一趟[0,n-2]for (int j = 1;j <n-i; j++){if (num[j - 1] > num[j]){swap(num[j-1], num[j]);flag = 1;}}if (flag == 0)break;}
}

二.插入排序:

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

最坏情况:逆序,N*(N-1)/2=O(N^2)。

最好情况:顺序,O(N)。

🏄‍♂️思路分析:

插入排序有点像我们打扑克牌,打扑克牌的时候,我们每拿一张牌,我们就会去和每一个进行比对,然后放在正确位置,让新拿到的牌和原来有序的序列变成新的有序的序列。

⛳️单趟理解:

如果[0,end]这段区间已经有序,我们想要将下num[end+1]插入到[0,end]这段区间中,使得[0,end+1]这段区间有序。

1.我们首先将num[end]与num[end+1]进行比较,如果num[end+1]的值小于num[end],那么我们就把num[end]移动到num[end+1]。这个一步的时候,num[end+1]就会被覆盖,所以我们可以考虑使用临时变量tmp存num[end+1],最后如果找到正确的位置,我们只需要将tmp的值给它就OK。

2.第一次完了以后,将end-1,然后用tmp和num[end]进行比较。

3.重复上面的步骤,当end减到某个值时,此时num[end]>=tmp就停止,此时[0,end]这个有序区间都<=tmp,end+2以后有序的区间都>tmp,最后我们只需要将tmp给num[end]就完成了单趟。

⛳️多趟理解:

只需要从[0,0]开始,插入n-1个元素就完成了排序。

🏄‍♂️代码解析:

//插入排序
void Insert_Sort(int* num, int n)
{for (int i = 0; i <= n - 2; i++){//end表示有序区间的最后一个下标//[0,end],end+1int end = i;int tmp = num[end + 1];while (end >= 0){if (tmp < num[end]){num[end + 1] = num[end];--end;}elsebreak;}num[end + 1] = tmp;}
}

🏄‍♂️冒泡排序和插入排序的比较:

1.冒泡排序如果要提前结束,就是整体有序,其他的都要只要有一次交换,那么就要把整体都交换。(每趟基本都是最坏)

2.但是插入排序,可以移动几个数,然后插入进去,插入位置前面的数就不要移动,这样就比冒泡排序的适应性更强。(每趟基本不是最坏)

三.希尔排序:

因为希尔排序太吊了,会单独用一篇文章讲。在专栏中能找到。

//希尔排序
void Shell_Sort(int* num, int n)
{int gap = n;while(gap>1){//加一的目的让最后一次gap为1gap /= 3+1;//end的最后位置:end+gap<nfor (int j = 0; j+gap<n; j++){int end = j;int tmp =num[j+ gap];while (end >=0){if (tmp < num[end]){num[end + gap] = num[end];end -= gap;}elsebreak;}num[end + gap] = tmp;}}
}

四.验证插入排序和希尔排序的实际实际比较:

🏄‍♂️头文件:

#pragma once
#include<iostream>
using namespace std;//打印数组
void Print(int* num, int n);//冒泡排序
void Bubble_Sort(int* num, int n);//希尔排序
void Shell_Sort(int* num, int n);//插入排序
void Insert_Sort(int* num, int n);

🏄‍♂️sort.cpp文件,函数实现文件:

#include<iostream>
#include<algorithm>using namespace std;//打印数组
void Print(int* num, int n)
{for (int i = 0; i < n; i++){printf("%d ", num[i]);}printf("\n");
}//冒泡排序
void Bubble_Sort(int* num, int n)
{//n-1趟for (int i = 0;i <n -1; i++){bool flag = 0;//第一趟[0,n-2]for (int j = 1;j <n-i; j++){if (num[j - 1] > num[j]){swap(num[j-1], num[j]);flag = 1;}}if (flag == 0)break;}
}void Shell_Sort(int* num, int n)
{int gap = n;while(gap>1){gap /= 3+1;//end的最后位置:end+gap<nfor (int j = 0; j+gap<n; j++){int end = j;int tmp =num[j+ gap];while (end >=0){if (tmp < num[end]){num[end + gap] = num[end];end -= gap;}elsebreak;}num[end + gap] = tmp;}}
}void Insert_Sort(int* num, int n)
{for (int i = 0; i <= n - 2; i++){//end表示有序区间的最后一个下标int end = i;int tmp = num[end + 1];while (end >= 0){if (tmp < num[end]){num[end + 1] = num[end];--end;}elsebreak;}num[end + 1] = tmp;}
}

🏄‍♂️测试文件:

#define  _CRT_SECURE_NO_WARNINGS 1
#include"Sort.h"
#include<stdlib.h>
#include<time.h>void Bubble_Sort_Test()
{int	n;cin >> n;int* num = new int[n];for (int i = 0; i < n; i++)scanf("%d", &num[i]);Print(num, n);Bubble_Sort(num, n);Print(num, n);delete[] num;
}void Shell_Sort_Test()
{int	n;cin >> n;int* num = new int[n];for (int i = 0; i < n; i++)scanf("%d", &num[i]);Print(num, n);Shell_Sort(num, n);Print(num, n);delete[] num;
}void test()
{srand(time(0));const int N = 100000;int* a1 = new int[N];int* a2 = new int[N];for (int i = 0; i < N; i++){a1[i] = rand();a2[i] = a1[i];}int begin1 = clock();Insert_Sort(a1, N);int end1 = clock();int begin2 = clock();Shell_Sort(a2, N);int end2 = clock();//Print(a1, N);//Print(a2, N);printf("Inert_Sort:%d\n", end1 - begin1);printf("Shell_Sort:%d\n", end2 - begin2);delete[] a1;delete[] a2;}int main()
{//Bubble_Sort_Test();//Shell_Sort_Test();test();return 0;
}

几百倍!

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

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

相关文章

【Nas】X-DOC:搞机之PVE部署All In One(黑群晖NAS 软路由OpenWrt Docker Win10远程桌面)

【Nas】X-DOC&#xff1a;搞机之PVE部署All In One&#xff08;黑群晖NAS & 软路由OpenWrt & Docker & Win10远程桌面&#xff09; 1、原硬件配置清单&#xff1a;2、改AIO后增加配置清单&#xff1a;3、虚拟化平台PVE&#xff1a;4、搭建的关键服务&#xff1a; 1…

Web高级开发实验:EL基本运算符与数据访问

一、实验目的 掌握EL的定义&#xff0c;即Expression Language&#xff0c;用于提高编程效率。学习和掌握在开发环境中创建Java文件&#xff0c;并在jsp文件中使用EL表达式去调用其中的方法与属性等。 二、实验所用方法 上机实操 三、实验步骤及截图 1、创建javaweb项目&a…

Springboot项目中常用注解

文章目录 Springboot相关注解EnableAspectJAutoProxy(exposeProxy true)内部实现机制 EnableTransactionManagementServletComponentScanMapperScan(basePackages {"com.xxx.mapper"})ComponentScan(basePackages{"*"})lombok Data注解Controller中的相关…

jvm虚拟机介绍

Java虚拟机&#xff08;JVM&#xff09;是Java语言的运行环境&#xff0c;它基于栈式架构&#xff0c;通过加载、验证、准备、解析、初始化等类加载过程&#xff0c;将Java类文件转换成平台无关的字节码&#xff0c;并在运行时动态地将其翻译成特定平台的机器码执行。 JVM的核心…

基于SSM农业信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;农业技术管理&#xff0c;种植户管理&#xff0c;农产品类型管理&#xff0c;农资订单管理&#xff0c;系统管理 种植户账号功能包括&#xff1a;系统首页&#xff0c;个人中心&a…

01C++书写hello world、注释、变量、常量

#include <iostream> using namespace std; int main()//main为一个程序的入口&#xff0c;每个程序都必须仅有一个 { cout<<"hello world"<<endl; } //#输出结果为 //单行注释的符号 /* 多行注释的符号 */ //变量创建的语法&#xff1a;数据类…

OpenAI GPT-o1实现方案记录与梳理

本篇文章用于记录从各处收集到的o1复现方案的推测以及介绍 目录 Journey Learning - 上海交通大学NYUMBZUAIGAIRCore IdeaKey QuestionsKey TechnologiesTrainingInference A Tutorial on LLM Reasoning: Relevant methods behind ChatGPT o1 - UCL汪军教授Core Idea先导自回归…

shodan2---清风

注&#xff1a;本文章源于泷羽SEC&#xff0c;如有侵权请联系我&#xff0c;违规必删 学习请认准泷羽SEC学习视频:https://space.bilibili.com/350329294 实验一&#xff1a;search 存在CVE-2019-0708的网络设备 CVE - 2019 - 0708**漏洞&#xff1a;** 该漏洞存在于远程桌面…

offset Explorer连接云服务上的kafka连接不上

以上配置后报连接错误时&#xff0c;可能是因为kafka的server.properties配置文件没配置好&#xff1a; 加上面两条配置&#xff0c;再次测试连接&#xff0c;成功 listeners和advertised.listeners

C++的相关习题(2)

初阶模板 下面有关C中为什么用模板类的原因&#xff0c;描述错误的是? ( &#xff09; A.可用来创建动态增长和减小的数据结构 B.它是类型无关的&#xff0c;因此具有很高的可复用性 C.它运行时检查数据类型&#xff0c;保证了类型安全 D.它是平台无关的&#xff0c;可移植…

Vue.js 组件开发教程:从基础到进阶

Vue.js 组件开发教程:从基础到进阶 引言 在现代前端开发中,Vue.js 作为一款流行的 JavaScript 框架,以其简单易用和灵活性赢得了开发者的青睐。Vue 组件是 Vue.js 的核心概念之一,理解组件的开发和使用对构建复杂的用户界面至关重要。本篇文章将详细介绍 Vue.js 组件的开…

NFS练习

一、实验目的 1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台…

MySQL全文索引检索中文

MySQL全文索引检索中文 5.7.6版本不支持中文检索&#xff0c;需要手动修改配置 ft_min_word_len 1 &#xff0c;因为默认配置 4 SHOW VARIABLES LIKE ft%; show VARIABLES like ngram_token_size;配置 修改 MySQL 配置文件 vim /etc/my.cnf在配置的 [mysqld] 下面添加**ft_…

C++——string的模拟实现(上)

目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…

【C++单调栈 贡献法】907. 子数组的最小值之和|1975

本文涉及的基础知识点 C单调栈 LeetCode907. 子数组的最小值之和 给定一个整数数组 arr&#xff0c;找到 min(b) 的总和&#xff0c;其中 b 的范围为 arr 的每个&#xff08;连续&#xff09;子数组。 由于答案可能很大&#xff0c;因此 返回答案模 109 7 。 示例 1&#x…

RabbitMQ是一个开源的消息代理和队列服务器

RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;协议实现&#xff0c;同时也支持其他消息协议如STOMP、MQTT等。作为一个可靠的消息传递服务&#xff0c;RabbitMQ在分…

了解光耦合器输入输出关系---腾恩科技

光耦合器&#xff0c;也称为光隔离器&#xff0c;是电子电路中必不可少的元件&#xff0c;主要用于在隔离部分之间传输信号&#xff0c;同时防止电噪声或高压影响敏感元件。其独特的设计使它们能够在没有直接电接触的情况下&#xff0c;弥合不同电压域之间的差距。在本文中&…

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(5)定时器和计数器

越努力&#xff0c;越幸运&#xff01; 兄弟们&#xff0c;要搬家到上海滴水湖了 职业生涯又迎来一次比较重要的变动 郑州->上海->上海临港 哈哈哈 flechazo 小柴冲刺软考中级嵌入式系统设计师系列总目录 一、硬件定时器 从硬件角度来看&#xff0c;定时器&#xf…

学习--图像信噪比

目录 图像信噪比 图像信噪比 图像信噪比的计算公式&#xff1a; 其中&#xff0c; M M M和 N N N分别表示图像长度和宽度上的像素数。 f ( i , j ) f(i,j) f(i,j) 和 g ( i , j ) g(i,j) g(i,j)分别是原始图像和去噪后的图像在点 ( i , j ) (i,j) (i,j)处的像素值。 信噪…

SYN590RL 300MHz至450MHz ASK接收机芯片IC

一般描述 SYN590RL是赛诺克全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容&#xff0c;灵敏度达到典型-110dBm&#xff0c;300MHz”450MHz 频率范围应用的单芯片ASK或OOK射频接收器。 SYN59ORL是一款典型的即插即用型单片高集成度无线接收器&…