排序(快速排序,归并排序,插入排序,选择排序,冒泡排序,希尔排序,堆排序)

news2025/2/24 9:28:31

给定你一个长度为 n

的整数数列。

请你对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n

第二行包含 n

个整数(所有整数均在 1∼109

范围内),表示整个数列。

输出格式

输出共一行,包含 n

个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

 代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 100010;
int n;
int q[N];
int sz,w[N];    //merge_sort
void inser_sort()   //直接插入排序   n^2   TLE
{
    for(int i=1;i<n;i++)            //遍历每一个位置
    {
        if(q[i-1]<=q[i]) continue;
        int t=q[i],j=i;
        while(q[j-1]>t&&j!=0)         //如果后面的数t大于前面的,则后面的数t往前移,直到遍历到没有比t大的位置时停止
        {
            q[j]=q[j-1];
            j--;
        }
        q[j]=t;
    }
}
void binary_search_insert_sort()    //折半插入排序  n^2    TLE
{
    for(int i=1;i<n;i++)
    {
        if(q[i-1]<=q[i]) continue;      
        int t=q[i];
        int l=0,r=i-1;    //二分查找
        while(l<r)                  //找到l=r的位置,q[l]>=t
        {
            int mid=(l+r)/2;                //下取整,要得到的在l左边
            if(q[mid]>t) r=mid;         
            else l=mid+1;
        }
        for(int j=i-1;j>=l;j--) q[j+1]=q[j];
        q[l]=t;
    }
}
void bubble_sort()              //冒泡排序
{
    for(int i=0;i<n-1;i++)      //排n-1次
    {
        bool has_swap=false;                //优化
        for (int j=n-1; j>i; j-- )          //从后往前,找到i个小的数
            if(q[j]<q[j-1])
            {
                swap(q[j],q[j-1]);
                has_swap=true;
            }
        if(!has_swap) break;                //如果没有交换,说明已经有序
    }
}
void select_sort()          //简单选择排序,每次选择出第i小的数到到第i位置
{
    for(int i=0;i<n-1;i++)
    {
        int k=i;                //用k记录最小数的位置
        for(int j=i+1;j<n;j++) 
            if(q[j]<q[k])
                k=j;
        swap(q[i],q[k]);
    }
}
void shell_sort()   //希尔排序
{
    for(int d=n/3;d;d= d==2?1:d/2)      //d个一组,找d
    {
        for(int start=0;start<d;start++)    //对每一组进行遍历
        {
            for(int i=start+d;i<n;i+=d)     //划分每一组,进行组内直接插入排序,从前往后遍历
            {
                int t=q[i],j=i;
                while(j!=start&&q[j-d]>t)
                {
                    q[j]=q[j-d];
                    j-=d;
                }
                q[j]=t;
            }
        }
    }
}
void quick_sort(int l,int r)        //快速排序
{
    if(l>=r) return;
    int i=l-1,j=r+1,x=q[(l+r)/2];       //选取分组中间的数作为基数
    while(i<j)
    {
        do i++;while(q[i]<x);
        do j--;while(q[j]>x);
        if(i<j) swap(q[i],q[j]);
    }
    quick_sort(l,j);            //此时必须写j,否则[0,1]边界死循环    //写i要改成i-1,i  x=q[(l+r+1)/2]或者q[r]
    quick_sort(j+1,r);
}
void down(int u)
{
    int t=u;
    if(u*2<=sz&&q[u*2]>q[t]) t=u*2;
    if(u*2+1<=sz&&q[u*2+1]>q[t]) t=u*2+1;
    if(u!=t)
    {
        swap(q[u],q[t]);
        down(t);
    }
}
void heap_sort()        //堆排序,下标一定要从1开始
{
    sz=n;
    for(int i=n/2;i;i--) down(i);
    for(int i=0;i<n-1;i++)
    {
        swap(q[1],q[sz]);
        sz--;
        down(1;)
    }
}
void merge_sort(int l,int r)        //二路归并排序
{
    if(l>=r) return;
    int mid=(l+r)/2;
    merge_sort(l,mid),merge_sort(mid+1,r);
    int i=l,j=mid+1,k=0;
    while(i<=mid&&j<=r)     //双指针算法
    {
        if(q[i]<=q[j]) w[k++]=q[i++];
        else w[k++]=q[j++];
    }
    while(i<=mid) w[k++]=q[i++];        //如果[mid+1,r]区间都小于[i,mid],这时将[i,mid]区间拼接到后面
    while(j<=r) w[k++]=q[j++];        //如果[l,mid]区间都小于[j,r]区间,则将[j,r]拼接到后面
    for(i=l,j=0;j<k;i++,j++) q[i]=w[j];
}
int main()
{
    scanf("%d", &n);
    for(int i=0;i<n;i++){
        scanf("%d", &q[i]);
    }
    // inser_sort();
    // binary_search_insert_sort();
    // bubble_sort();
    // select_sort();
    // shell_sort();
    // quick_sort(0,n-1);
    // heap_sort();
    merge_sort(0,n-1);
    for(int i=0;i<n;i++) printf("%d ",q[i]);
    return 0;
}

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

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

相关文章

【深度学习MOT】SMILEtrack SiMIlarity LEarning for Multiple Object Tracking,论文

论文&#xff1a;https://arxiv.org/abs/2211.08824 文章目录 AbstractIntroduction2. 相关工作2.1 基于检测的跟踪2.1.1 检测方法2.1.2 数据关联方法 2.2 基于注意力的跟踪 3. 方法3.1 架构概述3.2 用于重新识别的相似性学习模块&#xff08;SLM&#xff09; Experimental Res…

【Docker晋升记】No.2 --- Docker工具安装使用、命令行选项及构建、共享和运行容器化应用程序

文章目录 前言&#x1f31f;一、Docker工具安装&#x1f31f;二、Docker命令行选项&#x1f30f;2.1.docker run命令选项&#xff1a;&#x1f30f;2.2.docker build命令选项&#xff1a;&#x1f30f;2.3.docker images命令选项&#xff1a;&#x1f30f;2.4.docker ps命令选项…

上篇文章viewerjs(npm包补丁)的错误更正。(npm补丁本地没问题,流水线打包要没效果,要么报错)

1、上篇文档的包补丁在本地使用没有问题&#xff0c;并且同事拉代码后也会自动同步npm_modules&#xff0c;也没有问题 2、问题出现在打包上&#xff0c;我这边的项目是用teambition上的飞流设置的流水线来进行打包的&#xff0c;里面用到了两个指令 yarn install npm run bu…

学习左耳听风栏目90天——第二天 2/90(学习左耳朵耗子的工匠精神,对技术的热爱)【程序员如何用技术变现(上)】

总结&#xff1a; 要去经历大多数人经历不到的&#xff0c;要把学习时间花在那些比较难的地方。要写文章就要写没有人写过的&#xff0c;或是别人写过&#xff0c;但我能写得更好的。更重要的是&#xff0c;技术和知识完全是可以变现的。学好英文&#xff0c;看技术文档 程序员…

解决idea编辑application.yml文件或properties文件没有提示问题

注意&#xff1a;这里说的没有提示&#xff0c;是针对application.properties和application.yml文件 解决办法&#xff1a;在idea的插件面板中&#xff0c;禁用或卸载 wl Spring Assistant插件即可解决问题。

python技术栈 之 单元测试中mock的使用

一、什么是mock&#xff1f; mock测试就是在测试过程中&#xff0c;对于某些不容易构造或者不容易获取的对象&#xff0c;用一个虚拟的对象来创建以便测试的测试方法。 二、mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试&#xff0c;需要虚拟某些特定对象…

Java基础入门篇——While循环(十二)

目录 一、循环结构语句 二、while循环语句 三、do-while循环语句 四、break使用 一、循环结构语句 在实际生活中经常会将同一件事情重复做很多次。例如&#xff0c;在做眼保健操的第四节轮刮眼眶时&#xff0c;会重复刮眼眶的动作&#xff1a;打乒乓球时&#xff0c;会重复…

npm ERR! code ERESOLVEnpm ERR! ERESOLVE unable to resolve dependency tree

拉取项目到本地 执行 npm install 报错 遇到这个问题首先确认的就是版本是不是太高了&#xff0c;降一下版本。或者通过yarn命令替代npm install命令安装&#xff0c;同理&#xff0c;启动也可以采用yarn dev 启动代替npm run dev 下面教大家用一个NVM工具&#xff0c;这个工…

Linux基础与应用开发系列七:一切皆文件

Linux内核 屏蔽硬件区别&#xff0c;把所有的硬件设备抽象成文件&#xff0c;提供统一的接口给用户使用。 虚拟文件系统 抽象层&#xff0c;对文件的访问实际上使对抽象层的访问。 抽象对象&#xff1a;封装了底层读写细节&#xff0c;使用c语言的多态来实现具体文件系统系统…

乐鑫首创|使用 ESP RainMaker® 私有云定制 Matter 生态

ESP RainMaker 是乐鑫的 AIoT 云平台&#xff0c;支持客户自主部署私有物联网云&#xff0c;从而全面掌握数据所有权和管理权&#xff0c;实现定制功能与服务。ESP RainMaker 云后端采用 AWS 无服务器架构&#xff0c;拥有开源的 iOS 和 Android 移动端 APP、第三方语音助手集成…

Java—IO 流

Java—IO 流 &#x1f50d;文件创建文件获取文件相关信息目录相关操作 &#x1f50d;IO 流理解流与文件流的分类FileInputStreamFileOutputStream文件拷贝FileReaderFileWriter节点流与处理流类型 BufferedReaderBufferedWriterBufferedInputStream BufferedOutputStream对象处…

erp与crm的区别有哪些呢?两者之间有什么联系?

阅读本文您可以了解&#xff1a;1、crm系统的功能&#xff1b;2、erp系统的功能&#xff1b;3、crm系统和erp系统的区别 一、crm系统是什么 CRM系统是客户关系管理系统的缩写。它是一种用于帮助企业有效管理与客户关系相关的信息、活动和数据的软件工具或平台。 举个例子&…

在服务器上搭建gitlab

目录 1.在服务器上下载gitlab 2.编辑站点位置 3.重载配置 4.访问gitlab 最终效果展示&#xff1a; 官方文档&#xff1a; 安装部署GitLab服务 1.在服务器上下载gitlab wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.9.0-ce.0.el7.x86_64.r…

lombok 因 idea版本过高不可用

报错&#xff1a; 解决&#xff1a; 添加配置&#xff1a; -Djps.track.ap.dependenciesfalse

信创环境下 FTP如何进行国产化替代?

一、政策驱动&#xff0c;倡导自主、创新、协同 信创&#xff0c;即信息技术应用创新产业&#xff0c;其是数据安全、网络安全的基础&#xff0c;也是新基建的重要组成部分。为打破国外巨头的垄断&#xff0c;解决核心技术关键环节“卡脖子”问题&#xff0c;在核心芯片、基础…

电子保险丝

TPS2660 具有集成输入反极性保护功能的 4.2V 至 60V、150mΩ、0.1A 至 2.23A 电子保险丝 电流监测&#xff0c;故障输出&#xff0c;反向电流始终阻断&#xff0c;反极性保护 29元 TPS2640 具有集成反向输入极性保护功能的 42V、2A 工业电子保险丝 17元 MAX17561AUD 40V&…

robotframework+selenium 进行webui页面自动化测试

robotframework其实就是一个自动化的框架&#xff0c;想要进行什么样的自动化测试&#xff0c;就需要在这框架上添加相应的库文件&#xff0c;而用于webui页面自动化测试的就是selenium库. 关于robotframework框架的搭建我这里就不说了&#xff0c;今天就给大家根据一个登录的实…

【RocketMQ入门-安装部署与Java API测试】

【RocketMQ入门-安装部署与Java API测试】 一、环境说明二、安装部署三、Java API 编写Producer和Consumer进行测试四、小结 一、环境说明 虚拟机VWMare&#xff1a;安装centos7.6操作系统源码包&#xff1a;rocketmq-all-5.1.3-source-release.zip单master部署&#xff0c;在…

【论文研读】MARLlib 的架构分析

【论文研读】MARLlib: A Scalable Multi-agent Reinforcement Learning Library 和尚念经 多智能体强化学习框架研究。 多智能体强化学习库。 多智能体强化学习算法实现。 多智能体强化学习环境的统一化&#xff0c;标准化。 多智能体强化学习算法解析。 多智能体强化学习 算法…

Kafka:springboot集成kafka收发消息

kafka环境搭建参考Kafka&#xff1a;安装和配置_moreCalm的博客-CSDN博客 1、springboot中引入kafka依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><…