当前位置: 首页 > article >正文

【排序】快速排序

原理

对于一个数组x,快速排序流程如下:

  1. 确定分界点a,可以取x[l]、x[r]、x[l + r / 2]、随机(四种都可以)
  2. 调整区间,使得:区间被分成 <= a 和 >= a的两部分,左边 <= a,右边 >= a(注意,a不一定在原来的位置了)
  3. 递归处理左右两边

重点在于第二步调整区间上。

在这里插入图片描述

做法是:在区间[l, r]中,指定两个指针i、j。

  • 当i指向的数 < a的时候,i往右移动
  • 当j指向的数 > a的时候,j往左移动

当i和j停下来的时候,说明x[i] >= ax[j] <= a,则x[i] >= x[j]。那根据我们的想要实现的目的,要保证左边 <= a,右边 >= a,也就是x[i] <= x[j]。因此,需要将x[i]与x[j]交换。

复杂度

代码

import java.util.*;
import java.io.*;

class Main {
    
    public static void quick(int[] x, int l, int r) {
        if (l >= r) return ;
        
        int a = x[l + r >> 1], i = l - 1, j = r + 1;
        while (i < j) {
        	/**
				内层的循环不能加  i < j
				原因:如果加了i < j,那么两个do while之后,i = j。
				此时,如果x[j] > a,而后续的递归就会出问题,因为要保证[l, j]的数都 < a

				所以原则就是,最后外层循环退出的时候,要保证i > j,不能i = j
			*/
            do i ++ ; while (x[i] < a);
            do j -- ; while (x[j] > a);
            if (i < j) {
                int t = x[i];
                x[i] = x[j];
                x[j] = t;
            }
        }
        quick(x, l, j);
        quick(x, j + 1, r);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] x = new int[n];
        
        for(int i = 0; i < n; i ++ ) x[i] = sc.nextInt();
        
        quick(x, 0, n - 1);
        
        for(int i = 0; i < n; i ++ ) System.out.print(x[i] + " ");
    }
}

http://www.kler.cn/a/273356.html

相关文章:

  • Ghidra无头模式(自动化批处理执行重复性任务)
  • 基于vue框架的的冷链食品物流信息管理系统v81wb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • mysql left join group_concat 主表丢失数据
  • React第十三章(useTransition)
  • Openlayers高级交互(18/20):根据feature,将图形适配到最可视化窗口
  • vue+django+neo4j航班智能问答知识图谱可视化系统
  • 2024.3.18-408学习笔记-C-结构体
  • npm和pnpm安装、更换镜像源
  • 转录因子/组蛋白修饰靶基因数据库:Cistrome DB使用教程
  • huawei 华为交换机 配置手工模式链路聚合示例
  • 精准核酸检测(100用例)C卷(JavaPythonC++Node.jsC语言)
  • 深入理解与使用go之配置--实现
  • 京津冀自动驾驶产业盛会“2024北京国际自动驾驶技术展览会”
  • 前端结合 react axios 获取真实下载、上传进度
  • NFS性能优化参考 —— 筑梦之路
  • Unity中实现游戏对象逐渐放大的脚本教程
  • FreeRTOS入门基础
  • 【数据结构和算法初阶(C语言)】二叉树的顺序结构--堆的实现/堆排序/topk问题详解---二叉树学习日记②
  • GEE:为什么在机器学习分类或回归时,提取特征变量后的样本点下载到本地时,数据为空且缺少坐标?
  • AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互
  • 【QCM4490】开机慢
  • C++_day6
  • Qt5.14.2 深入理解Qt多线程编程,掌握线程池架构实现高效并发
  • 【低照度图像增强系列(3)】EnlightenGAN算法详解与代码实现
  • 房产销售平台|基于Spring cloud+ Mysql+Java+ Tomcat的房产销售平台设计与实现(可运行源码+数据库+设计文档)
  • ONLYOFFICE文档8.0全新发布:私有部署、卓越安全的协同办公解决方案