首页 > 编程语言 >算法基础——排序

算法基础——排序

时间:2023-01-11 17:34:09浏览次数:56  
标签:sort int 基础 mid while 算法 quick 排序

本文仅供个人记录、分享

快速排序

快排是经典的排序算法之一,其平均的时间复杂度为O(nlogn)
模板:
785. 快速排序 - AcWing题库

#include <iostream>

using namespace std;

const int N = 1e5 + 10;

int n;
int q[N];

void quick_sort(int q[],int l,int r){
    if (l >= r) return;
    
    int x = q[l + r >> 1],i = l - 1, j = r + 1;
    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(q, l, j);
    quick_sort(q, j + 1, r);
}

int main(){
    scanf("%d",&n);
    for(int i = 0; i < n;i ++) scanf("%d",&q[i]);
    
    quick_sort(q, 0, n - 1);
    
    for(int i = 0;i < n;i ++) printf("%d ",q[i]);
    
    return 0;
    
}

归并排序

归并排序也用到了分治的思想。其时间复杂度为O(nlogn)。
1.确定分界点 mid=(l+r)/2
2.先递归排序 left和 right
3.归并——合二为一。(核心)
模板:
787. 归并排序 - AcWing题库

#include <iostream>

using namespace std;

const int N = 1e5 +10;

int q[N],tmp[N]; //用来存答案的数组
int n;

void merge_sort(int q[], int l, int r)
{
    if(l >= r) return;
    
    int mid = l + r >> 1; //位运算,相当于(l + r) / 2
    
    merge_sort(q, l, mid),merge_sort(q, mid + 1, r);
    
    int k = 0, i = l, j = mid + 1;
    while(i <= mid && j <= r)
        if(q[i] <= q[j]) tmp[k ++] = q[i ++];
        else tmp[k ++] = q[j ++];
    while(i <= mid) tmp[k ++] = q[i ++];
    while(j <= r) tmp[k ++] = q[j ++];
    
    for(i = l, j = 0; i <= r; i ++, j ++) q[i] = tmp[j]; //将tmp数组中的值复制到q数组中
}

int main(){
    scanf("%d",&n);
    for(int i = 0; i < n; i ++) scanf("%d", &q[i]);
    
    merge_sort(q, 0, n - 1);
    
    for(int i = 0; i < n; i ++) printf("%d ",q[i]);
    
    return 0;
}

标签:sort,int,基础,mid,while,算法,quick,排序
From: https://www.cnblogs.com/SoftYurong/p/17044459.html

相关文章

  • Creator 2.x 升级 3.x 基础 API 差异总结
    上一篇我们介绍了CocosCreator2.x项目升级3.x的大流程。但最后一步,还需要手动将之前2.x写的函数注释一处处的放开。并将2.x的代码写法改成3.x的,下面我们就来......
  • vue el-date-picker多选日期时间时,支持时间排序
    需求背景:当el-date-picker可以多选日期时,时间的顺序是按照选择的顺序来的,体验不是很好。需要在选时间的同时进行时间排序 解决方案:使用watch监听v-model绑定的值的变......
  • 基于python的小波阈值去噪算法
    小波图像去噪原理图像和噪声在经小波变换后具有不同的统计特性:图像本身的能量对应着幅值较大的小波系数,主要集中在低频(LL)部分;噪声能量则对应着幅值较小的小波系数,并分散在......
  • 软件开发入门教程网之TypeScript 基础语法
    TypeScript基础语法TypeScript程序由以下几个部分组成:模块函数变量语句和表达式注释​​第一个TypeScript程序​​我们可以使用以下TypeScript程序来输出"HelloWorl......
  • 使用Stream流实现以List<Map<String, Object>>集合中Map的key值进行排序
    使用Stream流实现以List<Map<String,Object>>集合中Map的key值进行排序创建一个list存入数据List<Map<String,Object>>list=newArrayList<>();fo......
  • RocketMQ基础详解
    RocketMQRocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。主要功能是异步解耦和流量削峰。常见的......
  • Java开发|移动开发|算法工程师……20-50K,欢迎投递
    FreemenAPP作为一款专注于程序员招聘求职的平台,主旨在于帮助更多的IT程序员技术能有一个更加便捷和轻松的求职环境,帮助更多IT程序员解决生活和工作之间的矛盾,增加程序员收......
  • 微信小程序基础控件,入门(2),
    ​scroll-view纵向滚动<viewclass="page-section-title"bindtap='toRefreshPage'><text>VerticalScroll\n纵向滚动</text></view><viewclass="pa......
  • Redis基础之常用命令说明(二)
      Redis是Key-Value类型缓存型数据库,Redis为了存储不同类型的数据,提供了五种常用数据类型,如下所示:string(字符串)hash(哈希散列)list(列表)set(集合)zset(sortedset:有......
  • 算法设计与分析 Ch20问题与规约
    20.1NP问题20.1.1优化问题和判定问题一个优化问题往往可以转换成对应的判定问题。一般而言,优化问题时关注某种特殊的结构,并希望优化该结构的某种指标。Def20.1(Cliqu......