【排序】排序这样写才对Ⅰ --插入排序与选择排序

news2024/10/7 20:27:10

 

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

0.排序的概念及常见的算法:

0.1排序的概念:

0.2常见的算法:

1.直接插入排序:

1.1直接插入排序代码实现:

2.希尔排序:

2.1希尔排序代码实现:

3.选择排序:

3.1单路选择代码实现:

3.2双路选择代码实现:

4.堆排序:

4.1堆排序代码实现:

完结撒花:

 

0.排序的概念及常见的算法:

0.1排序的概念:

--------------------------------------------------------------------------------------------------------------------------

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

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

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

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

总的来说就是:让一串的数据,按照使用者想要的顺序尽行展示.

0.2常见的算法:

常见的排序算法有这些.将会分成几个章节讲完,感兴趣的uu们可以关注下我的排序专栏,方便和后期观看.

这章重点讲前两种排序:插入排序与选择排序.

1.直接插入排序:

顾名思义,其的运行原理为:选出一个数,不断与其之前的数据比较.在排升序的前提下,若目标值比其前一个小,则继续往前比较.比到目标值比齐前一个大为止.其时间复杂度为O(N^2)

这个排序与我们之前玩过的抽牌很像,想想是不是这样. 那我们直接来写写代码看看.

1.1直接插入排序代码实现:

void insertsort(int *a,int n)
{
    for(int j=1;j<n;j++)
    {
        int tmp=a[j];
        int end=j-1;
        while(end>=0)
        {
            if(tmp<a[end])
            {
                a[end+1]=a[end];
                end--;
            }
            else break;
        }
        a[end+1]=tmp;
    }
}

 注意这里需要先将a[j]的值,也就是目标值存储起来,否则在end后移的过程中,会将a[j]覆盖

2.希尔排序:

希尔排序不是一种新的排序.其是在插入排序的基础上改进的一种排序.其时间复杂度不稳定,

一般为O(N^1.25)--O(1.6N^1.25)

其核心思想为:

先将待排序数组的间隔gap位进行插入排序.之后gap不断缩减.最后仍然是做插入排序,也可以将直接插入排序看作为gap为一的希尔排序,当gap<1时停止

(这里因为已经有序了,所以就没有展现出gap为一的情况)

我们拿插入排序的代码来看看:

        也就是j依然每次往前移一位.在直接插入排序中,end初始为j-1,end每次跳一位.

                                                    在这里初始值为j-gap且每次跳gap位.

需要注意gap的取值可以任意,但需要满足最后会变成1的情况.也就是直接插入排序,临位调整的情况.(一般取值为:len/2或者len/3+1)

2.1希尔排序代码实现:

void shellsort(int *a,int n)
{
    int gap=n/2;
    while(gap>=1)
    {
        for(int j=0;j<n;j++)
        {
            int tmp=a[j];
            int end=j-gap;
            while(end>=0)
            {
                if(tmp<a[end])
                {
                    a[end+gap]=a[end];
                    end-=gap;
                }
                else break;
            }
            a[end+gap]=tmp;
        }
        gap/=2;
    }
}

3.选择排序:

依然顾名思义,其就是选择出一个最大/最小的值放在其左边/右边,然后不断缩减区间 ,即可完成.其时间复杂度为:O(N^2),我们一般不使用他

 这里给出两种代码方案:

3.1单路选择代码实现:

选择最小的放在左边

void selectsort(int *a,int n)
{
    for(int i=0;i<n;i++)
    {
        int min=a[i];
        for(int j=i+1;j<n;j++)
        {
            if(a[j]<min)
            {
                swap(a[j],min);
            }
        }
        a[i]=min;
    }
}

3.2双路选择代码实现:

从两个方向选择最大最小,然后依次放在左右,并缩减区间.

这里有个问题,若发生最大的值在左边,第一次交换完会改变,max值指向的内容

 所以要进行一次判定,若max==left,则说明真正的max被换到了刚刚min的位置,此时我们需要让max=min

 

void selectsort(int *a,int n)
{   
    int left=0,right=n-1;
    while(left<=right)
    {
        int max=right,min=left;
        for(int i=left+1;i<right;i++){
            if(a[max]<a[i])
            {
                max=i;
            }
            else if(a[min]>a[i])min=i;
        }
        swap(a[min],a[left]);
        if(max==left)max=min;
        swap(a[max],a[right]);
        left++,right--;
    }
}

4.堆排序:

这里前面介绍过了,就不再赘述.uu可以看 这篇文章 其时间复杂度为O(N*logN)

4.1堆排序代码实现:

void heapSort(HDataType *a,int n)
{
	/*for (int i = 1; i < n; i++)
	{
		UpAdjust(a, i);
	}*/
	for (int i = (n - 1 - 1 / 2); i >= 0; i--)
	{
		DownAdjust(a, n,i);
	}
 
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[end], &a[0]);
		end--;
		DownAdjust(a, end,0);
		
	}
}	

完结撒花:

🌈本篇博客的内容【排序这样写才对Ⅰ --插入排序与选择排序】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

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

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

相关文章

Axios请求(对于ajax的二次封装)——Axios请求的响应结构、默认配置

Axios请求&#xff08;对于ajax的二次封装&#xff09;——Axios请求的响应结构、默认配置知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货axios请求的响应结构响应格式详解实际请求中的响应格式axios请求的默认配置全局axios默认值&#xff08;了解…

Debug | wget 的安装与使用(Windows)

!wget -nc http://labfile.oss.aliyuncs.com/courses/780/WeatherData.zip 报错信息&#xff1a; wget 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 分析&#xff1a; 在jupyter notebook中做机器学习时导入数据使用!wget遇到了这个问题&#xff0c;查到…

轻松上手git代码版本管理工具--协同开发-冲突解决、线上分支合并以及使用pycharm操作git

一、协同开发 多人合作开发一个项目---->多人公用一个远程仓库 以后台项目为例: git init # git管理设置忽略文件.gitignore git add .git commit -m 第一次提交,写完了首页功能远程新建一个远程仓库(空) 创建一个origin git remote add origin git@gitee.com:xx…

穿戴规范智能识别系统 yolov7

穿戴规范智能识别系统通过yolov7python网络模型AI深度视觉学习算法&#xff0c;穿戴规范智能识别系统对工厂画面中人员穿戴行为自动识别分析&#xff0c;发现现场人员未按照规定穿戴着装&#xff0c;立即抓拍告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c…

垃圾满溢检测系统 yolov5

垃圾满溢检测系统通过pythonyolov5网络模型技术&#xff0c;垃圾满溢检测系统对控画面中小区内的垃圾桶进行7*24小时不间断监控&#xff0c;发现垃圾桶溢满周围有堆积物立即触发预警推送给相关人员处理。YOLOv5中在训练模型阶段仍然使用了Mosaic数据增强方法&#xff0c;该算法…

kubeadm方式部署k8s最新版本V1.26.2

Kubernetes核心概念 Master主要负责资源调度&#xff0c;控制副本&#xff0c;和提供统一访问集群的入口。--核心节点也是管理节点 Node是Kubernetes集群架构中运行Pod的服务节点。Node是Kubernetes集群操作的单元&#xff0c;用来承载被分配Pod的运行&#xff0c;是Pod运行的宿…

测试7年,去过阿里也去过小公司,给你们年轻人一个忠告...

你眼中的软件测试岗位是怎样的&#xff1f;大部分人可能会给出这样的回答&#xff1a;“测试&#xff1f;简单啊&#xff0c;没什么技术含量&#xff0c;无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现&#xff0c;麻烦点的就是测试下部署安装是否出现兼容性问…

分布式事务Seata原理

Seata 是一款开源的分布式事务解决方案&#xff0c;致力于提供高性能与简单易用的分布式事务服务&#xff0c;为用户提供了 AT、TCC、SAGA 和 XA 几种不同的事务模式。Seata AT模式是基于XA事务演进而来&#xff0c;需要数据库支持。AT 模式的特点就是对业务无入侵式&#xff0…

【故障定位】基于多元宇宙算法的主动配电网故障定位方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

LeetCode 37. 解数独

一、题目描述 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#x…

如果重回大学时光

目录如果重回大学时光1. 多参加社团活动&#xff0c;结交更多的朋友2. 认真考虑专业分流方向3. 根据兴趣和能力选择适合自己的出路4. 为未来做好准备&#xff0c;规划职业发展如果重回大学时光 当前我是一名普通的码农&#xff0c;还有几个月&#xff0c;又将有一批大学生将毕…

vue实现美观大方的动漫、cos、帖子类型网站

一、先上效果图 1.项目demo预览&#xff1a;点击预览 参照半次元的榜单-绘画榜、榜单-COS榜、榜单-写作榜、个人中心、登录注册页面&#xff0c;导航栏等&#xff0c;分别实现页面排版、数据交互、基础框架布局搭建以及自定义vue组件合理的封装及使用。在vue项目开发过程中&a…

梦中情树---二叉树

前言&#xff1a; 今天就来讲树的一种特殊结构---二叉树 当然先来给大家看一张图片 看到这棵树了吗&#xff1f;它从根开始&#xff0c;每个结点都有且仅有两个分支&#xff0c;这个结构就是我们的二叉树。 其实我们上次讲的堆也可以看成一棵二叉树&#xff0c;但是人家的本质…

【python】Jupyter的使用(python代码编辑器)

文章目录一、Jupyter的介绍1、Jupyter是什么&#xff1f;2、Jupyter有什么独特之处&#xff1f;二、Jupyter的安装1、首先要下载python2、用pip命令下载Jupyter三、Jupyter的使用1、运行Jupyter2、简要介绍Jupyter的使用方法3、快捷键的使用四、总结一、Jupyter的介绍 1、Jupy…

安卓系统软键盘初步分析

初步分析的相关日志 复现log: 11-05 14:01:24.768 7991 7991 V InputMethodManager: onViewClicked: true 11-05 14:01:24.768 7991 7991 D InputMethodManager: showSoftInput() viewandroidx.appcompat.widget.AppCompatEditText{bd0acc9 VFED..CL. .F.P..ID 0,0-900,9…

C# 基础:创建、数据类型转换、基本运算符、

VS 快捷键 Ctri K D 代码整理 Ctri KM O 代码收缩 Ctri J 弹出提示 halcon 窗体应用 添加在线第三方库 右键项目名 --> 管理NuGet程序包 halcon 界面&#xff0c;创建选择 添加halcon离线动态链接库 右键引用 --> 添加引用 --> 选择动态链接库 .dll文件 导入…

22勤于思考:gRPC都有哪些优势和不足?

如果你能从专栏的开篇词开始读到这篇文章并且能够在过程中认真思考,那么我相信你目前已经能够对gRPC有了较为充分了解。在专栏的最后几节中,我们抽出一篇文章。来探讨一下gRPC有哪些优势和不足,因为只有这样我们才能取其精华,去其糟粕,学习gRPC框架设计的优点,还能反观出…

NLP领域顶级会议和期刊汇总(附CCF最新推荐目录)

研究NLP需要关注学术界or大厂AI Lab最新的科研动态&#xff0c;了解技术发展的趋势&#xff0c;写论文才能下笔如有神。找到了论文就能找到要复现的代码和要用到的数据集。 掌握科研动态也有助于提早做好产品规划以及技术预研。 对于NLPer而言&#xff0c;了解科研动态最好的方…

总结:网卡

一、背景 经常听到eth0&#xff0c;bond0这些概念&#xff0c;好奇他们的区别&#xff0c;于是有了此篇文章记录下。 二、介绍 网卡&#xff1a;即网络接口板&#xff0c;又称网络适配器或NIC (网络接口控制器)&#xff0c;是一块被设计用来允许计算机在计算机网络上进行通讯…

一把LOL的时间我入门了Go语言

走进 Go 语言~ 前言&#xff1a; Go 语言是由 Google 公司推出的一款新的编程语言&#xff0c;作为谷歌的亲儿子&#xff0c;发展势头迅猛&#xff0c;各个大厂目前都在积极推进 Go 语言的使用。Go 是云计算、云原生、区块链等众多前沿领域的首推语言&#xff0c;目前流行的 …