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

【CT】LeetCode手撕—手撕快排

目录

  • 题目
  • 1-思路-快排
    • 1-1 快排的核心思想
      • 快速排序算法步骤
      • 优美的调整区间
    • 1-2 ⭐快排的实现
  • 2- 实现
    • ⭐912. 排序数组——题解思路
  • 3- ACM 实现

题目

  • 原题连接:912. 排序数组

1-思路-快排

1-1 快排的核心思想

  • 选择一个基准
    • 基准左侧的元素都小于该元素
    • 基准右侧的元素都大于该元素

image.png

快速排序算法步骤

  • ① 确定分界点:
    • 方式有三种:第一种取左边界点 q[ l ];第二种取中间点q[ l+r ];第三种取右边界点q[ r ];随机
  • ② 调整区间(★难点)
    • 使得左半边区间内的数都小于等于 x ;右半边区间内的数都大于等于 x
  • ③ 递归
    • 递归处理左右两段

优美的调整区间

  • 用两个指针分别指向数组的左边和右边,两个指针同时往中间走。
  • 如果指针 i 指向的数组的元素值小于 x ,则指针 i 向右移动一位,以此类推一直往下移动,直到指针 i 所指向的某个元素的值 大于等于 x,此时指针 i`` 停下不动。
  • 同理此时移动指针 j ,若指针 j 指向的元素的值大于等于 x 则指针 j 便向左移动,直到移动到 j 所指向的值小于等于 x

766AC1FD4EB24C2579F850B29BD8E35B.png

  • 当两个指针都停下来的时候,swap 交换两个指针指向的数,之后两个指针继续往中间走,以此类推直到两个指针相遇为止。

1-2 ⭐快排的实现

在这里插入图片描述

    public void quickSort(int[] nums,int left,int right){if(right<=left) return;// 定义 int i = left-1;int j = right+1;int x = nums[(i+j)/2];while(i<j){do{i++;}while(nums[i]<x);do{j--;}while(nums[j]>x);if(i<j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}quickSort(nums,left,j);quickSort(nums,j+1,right);}

2- 实现

⭐912. 排序数组——题解思路

在这里插入图片描述

class Solution {public int[] sortArray(int[] nums) {quickSort(nums,0,nums.length-1);return nums;}public void quickSort(int[] nums,int left,int right){if(right<=left) return;// 定义 int i = left-1;int j = right+1;int x = nums[(i+j)/2];while(i<j){do{i++;}while(nums[i]<x);do{j--;}while(nums[j]>x);if(i<j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}quickSort(nums,left,j);quickSort(nums,j+1,right);}
}

3- ACM 实现

public class quickSort {public static void quickSort(int[] nums,int left,int right){if(right<=left) return;// 定义int i = left-1;int j = right+1;int x = nums[(i+j)/2];while(i<j){do{i++;}while(nums[i]<x);do{j--;}while(nums[j]>x);if(i<j){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}quickSort(nums,left,j);quickSort(nums,j+1,right);}public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("输入数组长度");int n = sc.nextInt();int[] nums = new int[n];for(int i = 0 ;i < n;i++){nums[i] = sc.nextInt();}quickSort(nums,0,nums.length-1);System.out.println("排序结果为");for (int i:nums){System.out.print(i+" ");}}
}
http://www.lryc.cn/news/374779.html

相关文章:

  • 使用ARK工具ATool清除典型蠕虫MyDoom
  • 在hue中使用ooize调度ssh任务无法执行成功,无法查看错误
  • 一套轻量、安全的问卷系统基座,提供面向个人和企业的一站式产品级解决方案
  • 3秒生成!这个AI模型画风也太治愈了,新手也能轻松驾驭
  • 数字人全拆解:如何构建一个基于大模型的实时对话3D数字人?
  • 实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】
  • 2024北京智源大会
  • youlai-boot项目的学习—本地数据库安装与配置
  • Android平台如何实现多路低延迟RTSP|RTMP播放?
  • 深入探索Java开发世界:Java基础~类型分析大揭秘
  • 短URL服务设计
  • Kafka集成flume
  • 如何让视频有高级感 高级感视频制作方法 高级感视频怎么剪 会声会影视频剪辑制作教程 会声会影中文免费下载
  • 详解|访问学者申请被拒原因有哪些?
  • [鹤城杯 2021]BabyRSA
  • 西安市工业倍增引导基金子基金申报条件流程和材料程序指南(2024年)
  • 微型丝杆的耐用性和延长使用寿命的关键因素!
  • 音频文件下载后,如何轻松转换格式?
  • Intel平台,13600KF+3060Ti,虚拟机安装macOS 14(2024年6月)
  • Cookie、Session、Token的关系和区别
  • Windows 11 中安装 Docker Desktop 并安装镜像
  • 深入剖析Java线程池之“newWorkStealingPool“
  • 《跟我一起学“网络安全”》——安全设备
  • 猜测Tomcat如何实现WebSocket协议
  • uniApp @input事件更改输入框值,值改变了但是页面没更新新的值
  • 两行css 实现瀑布流
  • Centos7.9部署单节点K8S环境
  • 【CV】stable diffusion初步理解
  • 足底筋膜炎最好的恢复办法
  • Fiddler抓包工具介绍