排序算法问题

news2024/11/27 6:45:04

给你一个整数数组 nums,请你将该数组升序排列。

示例 1:

输入:nums = [5,2,3,1]
输出:[1,2,3,5]

示例 2:

输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]

代码如下:

1.插入排序(简单插入排序、直接插入排序)

//算法思想;从当前位置开始,从后往前找比数字小的,找到后插入到这个小的数字后面
//再找的过程中,如果发现一个比当前数字大,同时将这个数字往后移动
//时间复杂度:O(n^2)  空间复杂度O(1) 稳定性:稳定,没有跳跃式的交换数据 
//直接插入排序的特点:越有序越快;完全有序能达到O(n);
class Solution {
public:
    void InsertSort(vector<int>& nums,int n)
    {
        for(int i=0;i<n;i++) 
        {
            int temp = nums[i];//记录未排序数组的下标
            int j = i-1;//记录已经排序数组的下标
            while(j >= 0 && nums[j] >temp) 
            {
                nums[j+1] = nums[j];//当已经排序好的数组数字大于未排序的数组数字,将已经排序好的数字向后移一个
                j--;
            }
            nums[j+1] = temp;//如果未排序的数组数字大于已经排序好的数字,直接插入到排序好的数字后面
        }
    }
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        InsertSort(nums,n);
        return nums;
    }
};

2.希尔排序

//直接插入排序越有序越快是希尔排序的一个理论基础
//算法描述:1.间隔式的分组 2.利用直接插入排序让组内有序 3.缩小分组再次排序 4.再次调用直接插入排序  ...直到缩为一组完全有序
//时间复杂度:O(n^1.3-n^1.5)   空间复杂度:O(1)  稳定性:不稳定
class Solution {
public:
    void ShellSort(vector<int>& nums,int n)
    {
        int gap=n;
        while(gap>1)//间隔式分组,每一组利用直接插入排序,让组内有序
        {
            gap/=2;//每次分组都在上一组的基础上折半
            for(int i=gap;i<n;i++) 
            {
                int temp = nums[i];
                int j = i-gap;
                while(j >= 0 && nums[j] >temp) 
                {
                    nums[j+gap] = nums[j];
                    j-=gap;
                }
            nums[j+gap] = temp;
            }
        }
        
    }
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        ShellSort(nums,n);
        return nums;
    }
};

3.冒泡排序

代码如下:


//两两比较,大的往后走
//时间复杂度:O(n^2) 空间复杂度:O(1)  稳定性:稳定
class Solution {
public:
    void BubbleSort(vector<int>& nums,int n)
    {
        for(int i=0;i<n-1;i++)//走的趟数
        {
            for(int j=0;j<n-i-1;j++)//每走一遍,最大的数字在最后面,走的次数越多,越往后面的数字排序越正确
            {
                if(nums[j]>nums[j+1])//两两交换,较大的数字在后面
                {
                    int temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;

                }
            }
        }
       
        
    }
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        BubbleSort(nums,n);
        return nums;
    }
};

4.快速排序

代码如下:

//算法描述:先在数据中找到一个基准,从后往前找比基准小的数字,找到后往前挪动
//从前往后找比基准大的数字,找到往后挪动  重复之前的动作
//一次划分的时间复杂度:O(n) 划分logn次
//时间复杂度:O(nlogn)  空间复杂度:O(logn)(递归的次数)
//快排的缺点:空间复杂度大,不稳定
//快排最大缺点:越有序越慢,完全有序,为O(n^2)退化为选择排序
class Solution {
public:
    void QuickSort(vector<int>& nums,int left,int right)
    {
        if(left>=right)//只有一个数或区间不存在
        {
            return;
        }
        int i=left,j=right;//i在最左边,j在最右边
        int base=nums[left];//定义最左边的数字为基准
        while(i<j)
        {
            while(nums[j]>=base&&i<j)//从后往前找比这个比准数字小的
            {
                j--;
            }
            while(nums[i]<=base&&i<j)//从前往后找比这个基准数字大的
            {
                i++;
            }
            swap(nums[i],nums[j]);//找到之后交换两个数字
        }
        nums[left]=nums[i];//当i=j时,将基准数字与nums[i]交换
        nums[i]=base;
        //在一次完成之后,左边的数字都比基准数字小,右边的数字都比基准数字大
        QuickSort(nums,left,i-1);//递归左边
        QuickSort(nums,i+1,right);//递归右边
    }
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        QuickSort(nums,0,n-1);
        return nums;
    }
};

5.选择排序

代码如下:

//算法描述:每次都从待排序中找到最小值和待排序的第一个交换
//时间复杂度:O(n^2) 空间复杂度:O(1)  稳定性:不稳定
class Solution {
public:
    void SelectSort(vector<int>& nums,int n)
    {
        int minIndex;
        for(int i=0;i<n-1;i++)
        {
            minIndex=i;
            for(int j=i+1;j<n;j++)
            {
                if(nums[minIndex]>nums[j])
                {
                    minIndex=j;
                }
                
            }
            swap(nums[i],nums[minIndex]);
        }
        
    }
    vector<int> sortArray(vector<int>& nums) {
        int n=nums.size();
        SelectSort(nums,n);
        return nums;
    }
};

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

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

相关文章

Python 中轻松实现串口通信

迷途小书童的 Note 读完需要 3分钟 速读仅需 1 分钟 1 简介 pyserial 是一个 Python 库&#xff0c;它可以让您轻松地与串行端口进行通信。它支持多种操作系统&#xff0c;包括 Windows、Linux 和 macOS。pyserial 模块非常易于使用&#xff0c;并且提供了许多有用的功能。 2 实…

数学建模--二次规划型的求解的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #二次规划模型 #二次规划我们需要用到函数:Cvxopt.solvers.qp(P,q,G,h,A,b) #首先解决二次规划问题和解决线性规划问题的流程差不多 """ 求解思路如下: 1.针对给定的代求式,转化成标准式…

8.(Python数模)(预测模型一)马尔科夫链预测

Python实现马尔科夫链预测 马尔科夫链原理 马尔科夫链是一种进行预测的方法&#xff0c;常用于系统未来时刻情况只和现在有关&#xff0c;而与过去无关。 用下面这个例子来讲述马尔科夫链。 如何预测下一时刻计算机发生故障的概率&#xff1f; 当前状态只存在0&#xff08;故…

数学建模--最短路径算法的Python实现

目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 #最短路径算法 #针对有向图的最短路径问题,我们有很多的算法能解决. """ 目前主流算法如下所示: Dijkstra算法:Dijkstra算法是一种单源最短路径算法,用于计算从起点到其它所有节点的最短…

VIRTIO-BLK代码分析(0)概述

也无风雨也无晴。- 苏轼&#xff08;宋&#xff09; 接下来介绍VIRTIO相关内容。首先从VIRTIO-BLK开始分析&#xff0c;VIRTIO-BLK各部分交互图如下所示&#xff1a; 这里包含以下几个部分&#xff1a; Guest UserSpace&#xff1a;虚拟机用户空间&#xff0c;如虚拟机中运行f…

Unity中Shader的混合模式Blend

文章目录 前言一、混合的作用就是实现各种半透明效果二、混合操作三、在 Shader 中暴露两个属性 来调节 混合的效果 前言 Unity中Shader的混合模式Blend 一、混合的作用就是实现各种半透明效果 这里用PS里的混合作为例子 没选择混合效果前&#xff0c;显示的效果是这样 选择…

嵌入式开发-IIC通信介绍

IIC&#xff08;Inter-Integrated Circuit&#xff09;是一种两线式串行总线协议&#xff0c;用于连接微控制器及其他外围设备。在IIC总线上的数据传输速率可以是标准模式&#xff08;100Kbit/s&#xff09;&#xff0c;快速模式&#xff08;400Kbit/s&#xff09;和高速模式&a…

决策树算法学习笔记

一、决策树简介 首先决策树是一种有监督的机器学习算法&#xff0c;其采用的方法是自顶向下的递归方法&#xff0c;构建一颗树状结构的树&#xff0c;其具有分类和预测功能。其基本思想是以信息熵为度量构造一棵熵值下降最快的树&#xff0c;到叶子节点处的熵值为零。决策树的构…

【强化学习】MDP马尔科夫链

基本元素 状态集&#xff1a;表示智能体所处所有状态的全部可能性的集合。类似的集合&#xff0c;行为集&#xff0c;回报集决策&#xff1a;规定我在某个状态下&#xff0c;我做出某个action马尔可夫链&#xff1a;学术上来说是无记忆性质。说白了就是我只在乎我目前的状态。…

Axes3D绘制3d图不出图解决办法【Python】

运行下面一段代码​&#xff1a; import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D#这里设函数为y3x2x_data [1.0,2.0,3.0]y_data [5.0,8.0,11.0]​def forward(x): return x * w b​def loss(x,y): y_pred forward(x) …

山西省文物局与大势智慧签订战略合作协议

8月24日&#xff0c;由山西省文物局、中国文物信息咨询中心(国家文物局数据中心)主办的数字文博发展论坛在太原举行。武汉大势智慧科技有限公司&#xff08;后简称“大势智慧”&#xff09;受邀参与&#xff0c;与来自国内文博数字化领域的专家学者齐聚一堂&#xff0c;围绕“数…

华为数通方向HCIP-DataCom H12-821题库(单选题:241-260)

第241题 ​​LS Request​​报文不包括以下哪一字段? A、通告路由器(Advertising Router) B、链路状态 ID (Link Srate ID) C、数据库描述序列号(Database Dascription Sequence lumber) D、链路状态类型 Link state type) 答案:C 解析: LS Request 报文中包括以下字段…

浅谈下cdn以及防盗链问题

目录 一、什么是cdn 二、使用cdn带来的好处 三、CDN工作原理 四、cdn使用场景 五、流媒体CDN之防盗链问题 一、什么是cdn CDN&#xff08;Content Delivery Network&#xff09;是一种分布式网络架构&#xff0c;用于提供高效的内容分发服务。CDN通过将内容缓存在离用户最…

VLDB 2023 | CDSBen: 字节跳动 veDB 数据库存储系统性能测试模型

背景 随着业务爆炸式增长与云原生技术的日渐成熟&#xff0c;大量云原生分布式数据库产品如雨后春笋般涌现&#xff0c;其中一部分主打 OLTP 场景的分布式数据库强调的是从计算-存储分离架构获得弹性收益&#xff1b;对于业界各种计算-存储分离架构的数据库而言&#xff0c;怎么…

3环断链以及断链后的检测方法

3环断链以及断链后的方法 我们在3环注入代码很多时候会选择注入dll&#xff0c;因为纯粹的硬编码不方便写出大量功能&#xff0c;而且不容易维护所以很多时候我们会通过各种方式让我们的dll注入到目标地址空间中&#xff0c;其中有一些方式可以不需要我们自己对dll处理重定位而…

C语言每日一练--Day(15)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;珠玑妙算 两数之和 &#x1f493;博主csdn个人主页&#xff1a;小小uni…

Docker安装MySQL教程

虽然 docker 安装 mysql 不是一个很好的方案&#xff0c;但是为了个人使用方便&#xff0c;使用 docker 安装 mysql 还是没什么问题的。 本文为了方便&#xff0c;我们直接通过yum方式安装。所以&#xff0c;我们在安装之前需要电脑可以联网&#xff0c;不然我们这种方式是安装…

ASP.NET Core 中的 MVC架构

MVC 架构 MVC架构把 App 按照逻辑分成三层&#xff1a; Controllers&#xff0c;接收 http request&#xff0c;配合 model&#xff0c;通过http response 返回 view&#xff0c;尽量不做别的事Models, 负责业务逻辑&#xff0c;App 的状态&#xff0c;以及数据处理Views&…

数学建模--Seaborn库绘图基础的Python实现

目录 1.绘图数据导入 2. sns.scatterplot绘制散点图 3.sns.barplot绘制条形图 4.sns.lineplot绘制线性图 5.sns.heatmap绘制热力图 6.sns.distplot绘制直方图 7.sns.pairplot绘制散图 8.sns.catplot绘制直方图 9.sns.countplot绘制直方图 10.sns.lmplot绘回归图 1.绘图数…

【C++】原子类型非线程安全

原子类型非线程安全 #include <iostream> #include <thread>int main() {int num 0;int count 100000;std::thread thread1([&](){for(int i 0; i < count; i){num;}});std::thread thread2([&](){for(int i 0; i < count; i){num;}});std::thr…