首页 > 其他分享 >1.1快排

1.1快排

时间:2024-04-02 13:00:44浏览次数:22  
标签:do 下标 1.1 int 快排 while 数组 --

void quick_sort(int q[], int l, int r) //l是数组最左边的下标,r是数组最右边的下标。
{
    if (l >= r) return; //数组中只有一个数或没有数。

    int i = l - 1, j = r + 1, x = q[l + r >> 1]; //i,j的起始在数组两头
    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);
}

上砖为acwing上的模板 。

注意到第三句砖码有 x=q[l+r>>1] , l+r>>1意思为和除以2取整

数组中的数从 i 的位置开始向后与 x 比较大小,小于 x 则 i++,继续向后比较后面的数与 x 的大小;大于 x 则跳出此循环转入 j 与 x 的比较循环中(见下行)。

数组中的数从 j 的位置开始向前与 x 比大小,大于x则 j--,继续向前比较与x的大小,小于x时跳出此循环。

如果两个循环都跳出来了,且 i 在 j 的前面,则交换下标为 i 的数与下标为 j 数的位置。每次迭代都会使得一个在前面的且大于 x 的数与一个在后面的且小于 x 的数交换位置。

当 j<=i 时,跳出最外层的while循环,此时前半部分都是小于 x 的数,后半部分都是大于 x 的数。

接着是两个内嵌的调用,把刚才的前半部分和后半部分内部也重新排列成小的在前部分,大的在后部分,以此类推,直到排序的区间小到不能再小。

下面这个模板是内部调用 quicksort 的时候用 i-1 和 i 替换 j 和 j+1 。需要注意的是 x 必须= q[r] ,而不是 q[l] 或 q[l+r>>1] ,不然会出现边界问题。 

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

来看一道例题: 

#include<iostream>
using namespace std;
const int N=1e5+10;
int n;
int a[N]={0};
void quicksort(int q[],int l,int r){
    if(l>=r) return;
    int i=l-1,j=r+1,x=q[l+r>>1];
    while(i<j){
        do i++;while(x>q[i]);
        do j--;while(x<q[j]);
        if(i<j) swap(q[i],q[j]);  
    }
	quicksort(q,l,j);quicksort(q,j+1,r);
}
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    quicksort(a,0,n-1);
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

标签:do,下标,1.1,int,快排,while,数组,--
From: https://blog.csdn.net/weixin_61747496/article/details/137057929

相关文章

  • 1.1.1、操作系统发展史、Linux 与 Unix
    关注公众号“融码一生”,领取全套PDF/电子书Linux是众多操作系统之一,常见操作系统:win7、win10、Mac、Android、IOS。计算机是一台按用户要求接收信息、存储与处理数据,再将处理结果输出(文字、图片、音频、视频等)的机器。计算机由硬件和软件组成:硬件是计算机赖以工作......
  • 算法模板 v1.10.5.20240330
    算法模板v1.1.1.20240115:之前历史版本已不可寻,创建第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”;删除“编译”-“手动开O优化”;修改“编译”-“CF模板”;删除“读写”;删除“图论”-“欧拉图”-“混合图”;删除“图论”-“可达性统计”;删除“数据类型”-“高精类”。......
  • helm 安装 nginx-ingress-controller v1.10.0
    1、说明准备nginx-ingress三种不同的部署模式Deployment+LoadBalancer采用deployment进行部署nginx-ingress-controller,需要创建一个type:LoadBalancer的service进行关联nginx-ingress-controller这组pod。通常是在使用公有云进行创建负载均衡器并绑定公网地址。只要将域名......
  • MogDB 2.1.1 初始化参数概要说明
    MogDB2.1.1初始化参数概要说明本文出处:https://www.modb.pro/db/394787MogDB数据库安装完成后,官方文档提供了刷新参数的脚本,推荐执行脚本来进行初始化参数设置。本文在官方提供脚本的基础上添加了简单说明,方便新学习的同学能大概了解参数作用。CentOS7.7下标准安装MogDB......
  • hadoop-3.1.1分布式搭建与常用命令
    一、准备工作1.首先需要三台虚拟机:master、node1、node22.时间同步ntpdatentp.aliyun.com3.调整时区cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime 4.jdk1.8java-version5.修改主机名三台分别执行vim/etc/hostn......
  • 大数据数仓理论1.1-离线
    分区静态分区        内存将划分为多个区域,每个区域对应一个分区,当程序访问内存时系统将为其分配一个固定大小的分区;    优点:简单易于管理    缺点:浪费资源,内存碎片化积多动态分区            内存会划分为不同大小的分区,程......
  • Bootloader/IAP零基础入门(1.1) —— 设计一个Bootloader引导进入APP的程序,包含中断向量
    前言(1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动/单片机/RTOS的实习岗位,可C站直接私聊,或者邮件:[email protected],此消息至2025年1月1日前均有效(2)在上一章节中,我们详细介绍了如何让Bootloader引导进入APP程序。但是上一章节的工程是无法使用......
  • 说说 HTTP1.0/1.1/2.0 的区别?
     一、HTTP1.0HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本HTTP1.0 浏览器与服务器只保持短暂的连接,每次请求都需要与服务器建立一个TCP连接服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求简单来讲,每次与服务器交互,都需要新......
  • openEuler20.03操作系统上安装部署MogDB2.1.1
    openEuler20.03操作系统上安装部署MogDB2.1.1本文出处:https://www.modb.pro/db/378319openEuler操作系统上安装mogdb:下载openEuler镜像文件:openEuler-20.03-LTS-x86_64-dvd.iso可以到各镜像源网站下载:例如:清华源下载地址:https://mirrors.tuna.tsinghua.edu.cn/openeule......
  • [nacos] 基于Docker安装Nacos(2.1.1)
    0序环境信息centos:7.9docker:25.0.4nacos-server:2.1.11安装步骤(nacos/nacos-server镜像版)Step1拉取镜像dockerpullnacos/nacos-server:v2.1.1dockerimagesStep2创建、并运行NacosServerDemo容器创建、并运行NacosDemo容器dockerr......