首页 > 其他分享 >01排序

01排序

时间:2023-01-01 21:22:17浏览次数:58  
标签:sort 01 半边 int mid 序列 排序

快速排序

问题

将序列 q 的 l ~ r 区间排序
void quick_sort(int q[], int l, int r)

基本思想 —— 分治

  1. 找一个参考值 x
  2. 通过双指针算法交换使得 左半边全部是 <= x , 右半边全部是 >= x
    1. 移动左指针 i ,找到大于 x 的数
    2. 移动右指针 j ,找到小于 x 的数
    3. 交换逆序对
  3. 递归处理 左半边 右半边

模板

void quick_sort(int q[], int l, int r){
    if(l >= r) return;
    int i = l - 1, j = r + 1, x = q[l] + q[r] >> 1;
    while(i < j){
        while(q[++ i] < x);
        while(q[-- j] > x);
        if(i < j) swap(q[i],q[j]);
    }
    quick_sort( q, l, j), quick_sort( q, j + 1, r);
}

注意点: 分界点的选择可以是[ l , j ]、 [ j + 1 , r ] 或者 [ l, i - 1 ]、[ i , r ],
swap 的时候不要忘记判断 i < j

归并排序

与快排的先排完上层,再排下层不同,归并排序是先排完下层再排上层

问题

将序列 q 的 l ~ r 区间排序
void merge_sort(int q[], int l, int r)

基本思想

  1. 先排完左半边[ l , mid ]、再排完右半边[ mid + 1, r ]
  2. 将左右两个有序序列进行合并
    1. i , j 两个指针分别指向两个有序子序列的头,哪个小就输出哪个,并指向后一个,直到有一个序列指针到达末尾
    2. 将未全部输出的序列全部输出
  3. 处理左半边 和 右半边 同样使用递归的方式

模板

int tmp[N]; // 很大,最好开在外面
void merge_sort(int q[], int l, int r){
    if(l >= r) return; // 递归的出口
    int mid = l + r >> 1;
    merge_sort(q, l, mid), merge_sort(q, mid + 1, r);
    int i = l, j = mid + 1, k = 0;
    
    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(int i = l, j = 0; i <= r; i ++, j ++) q[i] = tmp[j];
}

标签:sort,01,半边,int,mid,序列,排序
From: https://www.cnblogs.com/da-zhi/p/17018604.html

相关文章

  • 好题分享、心路历程(力扣601)——连续登录
    【题目介绍】该题为力扣601,名为体育馆的人流量。【题型分类】属于连续专题。官网标为困难题。【思路分享】这里的连续类似时间连续,采用row_number()技巧解题。关......
  • Luogu P5676 [GZOI2017] 小z玩游戏
    P5676[GZOI2017]小z玩游戏难度:提高+/省选-标签:Tarjan建图\(\mathtt{blog}\)有\(n\)组数\((w_i,e_i)\),如果当前数值为\(w_i\)即可改变为\(e_i\),如果当前数值......
  • HDU 6439 2018CCPC网络赛 Congruence equationI(杜教筛 + 莫比乌斯反演 + 伯努利数)
      大致题意:给你一个长度为k的序列a。对于序列c,当  时,;当时,取[0,m)中任意一个数字。令  表示满足  的序列c的方案数。现在让你求 。          ......
  • P1955 [NOI2015] 程序自动分析
    [NOI2015]程序自动分析题目简述输入的第一行包含一个正整数\(t\),表示需要判定的问题个数。注意这些问题之间是相互独立的。对于每个问题,包含若干行:第一行包含一个正......
  • BUUCTF-[极客大挑战 2019]Http
    一道考察http请求头X-Forwarded-For字段和Referer字段User-Agent字段的题目  一、基础知识X-Forwarded-For(XFF)又名XFF头1)概述:X-Forwarded-For(XFF)是用来识别通过HT......
  • WSL2清理占用的磁盘空间 WSL下Docker启动SQL Server 2019
    WSL下Docker中启动SQLServer2019开启Dockerdeamon服务命令sudoservciedockerstart拉取镜像dockerpullmcr.microsoft.com/mssql/server:2019-latest启......
  • java基础--01
    因为考研大半年没有学java很多基础知识都已经忘了,但是幸好一直在学C语言,作为基础的编程的语言和Java的很多地方还是很像的,特别是一些标识符数据类型表达式什么的,但是java在......
  • C++公司员工考勤管理系统[2023-01-01]
    C++公司员工考勤管理系统[2023-01-01]题目15“公司员工考勤管理系统设计”1、问题描述某公司需要存储雇员的编号、姓名、性别、所在部门,级别,并进行工资的计算。其中,雇......
  • C语言基于二叉排序树的学生成绩管理系统
    C语言基于二叉排序树的学生成绩管理系统1、基于二叉排序树的学生成绩管理系统1.1题目简述本次课题要求基于二叉排序树设计和实现一个简易的学生成绩管理系统,功能包含对......
  • 【排序】【数组】LeetCode 75. 颜色分类
    题目链接75.颜色分类思路题目要求按0、1、2的顺序排序,因为数量有限,所以通过两次遍历,分别将0和1交换到合适的位置,这样两次遍历之后,剩下的2就都在尾部了。代码classSol......