算法基础-快速排序

devtools/2024/11/14 12:47:07/

快速排序

                    

i、j不相邻时,指向同一个下标
i、j相邻时,j 比 i 小

不管是否相邻,最后一次循环的if条件一定是 i>=j 来退出循环,即最后一次的 if(i<j) 不执行


按照 j 来划分,x = a[l + r >> 1],分为 [ l,j ]、[ j + 1, r ]

按照 i 来划分,x = a[l + r + 1 >> 1],分为 [ l,i - 1]、[ i, r ]

i 和 j 相互对应的,记住 j 就行

do i++; while(a[i] < x);
        会使得 a[l..i-1] <= x, a[i] >= x

do j--; while(a[j] > x);
        会使得 a[j+1..r] >= x, a[j] <= x

if(i < j) swap(q[i], q[j]);
        会使得 a[l..i] <= x, a[j..r] >= x

a[ j ] <= x 停住,a[ i ] >= x 停住,交换,a[ j ] >= x,j --

所以循环结束后a[ l ... j ] <= x,a[ j + 1 ... r ] >= x

do while 先自增自减 ,i 从 l - 1 开始, j 从 r + 1 开始

public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[] a = new int[n];for (int i = 0; i < n; i ++ )a[i] = in.nextInt();quick_sort(a, 0, n - 1);for (int i = 0; i < n; i ++ )System.out.print(a[i] + " ");}static void quick_sort(int a[],int l, int r) {if(l >= r)return;int i = l - 1, j = r + 1, x = a[l + r >> 1];while(i < j) {do {i ++;}while(a[i] < x);do {j --;}while(a[j] > x);if(i < j) {int t = a[i];a[i] = a[j];a[j] = t;}}quick_sort(a,l,j);quick_sort(a,j + 1, r);}
}

第K个数

根据排序后左右两边的数字个数,选择一边进行查找 

public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int k = in.nextInt();int[] a = new int[n];for (int i = 0; i < n; i ++ )a[i] = in.nextInt();System.out.println(quick_sort(a, 0, n - 1, k));}static int quick_sort(int a[],int l, int r, int k) {if(l >= r)return a[l];int i = l - 1;int j = r + 1;int x = a[l + r >> 1];while(i < j) {do i ++; while(a[i] < x);do j --; while(a[j] > x);if(i < j) {int t = a[i];a[i] = a[j];a[j] = t;}}int l_cnt = j - l + 1;if(k <= l_cnt)return quick_sort(a,l,j,k);return quick_sort(a,j + 1, r,k - l_cnt);}
}


http://www.ppmy.cn/devtools/108982.html

相关文章

前端***

void&#xff08;0&#xff09;的作用是什么&#xff1f; void操作符使表达式的运算结果返回 undefined。 void&#xff08;0&#xff09;用于防止页面刷新&#xff0c;并在调用时传递参数“0”。 void&#xff08;0&#xff09;用于调用另一种方法而不刷新页面。 列举几种类…

【C++】::的解析

:: 是 C 中的作用域解析运算符&#xff08;scope resolution operator&#xff09;。它用于指定某个名字&#xff08;如类、函数、变量等&#xff09;所属的作用域或命名空间。 :: 的作用是帮助明确区分不同作用域中的名字&#xff0c;避免命名冲突和提高代码的可读性。 主要…

[数据集][目标检测]肺炎检测数据集VOC+YOLO格式4983张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4983 标注数量(xml文件个数)&#xff1a;4983 标注数量(txt文件个数)&#xff1a;4983 标注…

龙芯+FreeRTOS+LVGL实战笔记(新)——06添加二级按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了完善与优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以…

Elasticsearch:无状态世界中的数据安全

作者&#xff1a;来自 Elastic Henning Andersen 在最近的博客文章中&#xff0c;我们宣布了支持 Elastic Cloud Serverless 产品的无状态架构。通过将持久性保证和复制卸载到对象存储&#xff08;例如 Amazon S3&#xff09;&#xff0c;我们获得了许多优势和简化。 从历史上…

【ArcGIS Pro第一期】界面简介

ArcGIS Pro简介 ArcGIS Pro界面简介1.1 打开工程1.2 使用功能区上的工具 参考 ArcGIS Pro 是一种基于功能区的应用程序。 ArcGIS Pro 窗口顶部的功能区有许多命令可供选择&#xff0c;而根据需要打开的各个窗格&#xff08;可停靠窗口&#xff09;中则提供了更为高级或专用的功…

鸿蒙界面开发——组件(3):视频组件video

视频组件video Video(value: VideoOptions)VideoOptions对象说明: src string | Resource 否 视频的数据源&#xff0c;支持本地视频和网络视频。 Resource格式可以跨包/跨模块访问资源文件&#xff0c;常用于访问本地视频。 支持rawfile文件下的资源&#xff0c;即通过$raw…

php邮箱服务器怎么搭建?如何构建服务器?

php邮箱服务器配置教程指南&#xff1f;php邮件服务器如何搭建&#xff1f; 搭建一个稳定高效的php邮箱服务器&#xff0c;不仅可以提升邮件传输的效率&#xff0c;还能增强数据的安全性。那么&#xff0c;如何着手搭建这样一个服务器呢&#xff1f;AokSend将详细探讨php邮箱服…