java 实现快速排序

article/2025/9/15 13:24:34

1.介绍

快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序 过程可以递归进行,以此达到整个数据变成有序序列。

快速排序最好时间复杂度是O(n * log n),最坏时间复杂度是O(n*2) ,平均复杂度是O(n * log n) 

对数log n :表示以2为底 n的对数

2.切分原理 

切分原理: 把一个数组切分成两个子数组的基本思想:

1.找一个基准值,用两个指针分别指向数组的头部和尾部;

2.先从尾部向头部开始搜索一个比基准值小或等于的元素,搜索到即停止,并记录指针的位置;

3.再从头部向尾部开始搜索一个比基准值大或等于的元素,搜索到即停止,并记录指针的位置;

4.交换当前左边指针位置和右边指针位置的元素;

5.重复2,3,4步骤,直到左边指针的值大于右边指针的值停止。 

代码实现

import java.time.Duration;
import java.time.LocalTime;public class QuickSort {public static void main(String[] args) {test1();
//		test2();}public static void test1() {
//		int arr[]= {-9,78,0,23,-567,70};int len = 12;int arr[]=new int [len];for(int i=0;i<len;i++) {arr[i]=(int) (Math.random()*100);}System.out.println("排序前的数组:");printArr(arr);quickSort(arr, 0, arr.length-1);System.out.println("排序后的数组:");printArr(arr);}//若干万数据,测试排序的时间public static void test2() {int len=80000;int arr[]=new int [len];for(int i=0;i<len;i++) {arr[i]=(int) (Math.random()*len);}LocalTime before=LocalTime.now();System.out.println("排序前的时间:"+before);quickSort(arr,0,len-1);LocalTime after=LocalTime.now();Duration duration=Duration.between(before, after);System.out.println("排序后的时间:"+after);System.out.println("时间差(毫秒):"+duration.toMillis());}private static void quickSort(int[] arr, int lo, int hi) {if(lo>=hi) return ;int partition=partition(arr,lo,hi);quickSort(arr,lo,partition-1);quickSort(arr,partition+1,hi);}private static int partition(int[] arr, int lo, int hi) {//把最左边的元素当作基准值int key=arr[lo];int left=lo; //int right=hi+1;while(true) {//左指针遇到>=key的值,才停下while(arr[++left] < key) {if(left==hi) break;}//右指针遇到<=key的值,才停下while(key < arr[--right]) {if(right==lo) break;}if(left>=right) {//扫描了所有元素,结束循环break;}else {//交换左右指针swap(arr,left,right);}}//right指向的值一定是小于或等于key值,所以交换key和右指针的值swap(arr,lo,right);return right;}/*** 交换数组两个元素* @param arr* @param i* @param j*/private static void swap(int[] arr, int i, int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}private static void printArr(int[] arr) {for (int i : arr) {System.out.print(i+" ");}System.out.println();}
}

运行结果:

test1()

 test2

快速排序的另一种实现

我认为这种写法更容易理解

public static void QuickSort(int []arr,int low,int high) {if(low<high) {int pivotpos=partition(arr,low,high);QuickSort(arr,low,pivotpos-1);QuickSort(arr,pivotpos+1,high);}}private static int partition(int[] arr, int low, int high) {int pivot=arr[low];while(low<high) {//起初,一定要从右边指针开始,因为arr[low]的值已经扔给了pivot,arr[low]//想象成无数字的空位while(low<high&&pivot<=arr[high]) {--high;}//把比pivot的小的数扔到左边指针//把arr[high]扔到arr[low]这个空位上//然后,high位置可以想象成无数字的空位arr[low]=arr[high];while(low<high&&arr[low]<=pivot) {++low;}//把比pivot大的数扔到右边//把arr[low]扔到arr[high]这个空位上//然后,low位置可以想象成是无数字的空位arr[high]=arr[low];}//此时low==high,return high也一样arr[low]=pivot;return low;}
}

 


http://chatgpt.dhexx.cn/article/cIxIMDiV.shtml

相关文章

使用 Java 实现快速排序(详解)

一、概述 最近在看一些面试题&#xff0c;发现很多面试过程中都会要求手写快速排序&#xff0c;查阅一些博客发现别人写的并不是特别清楚而且也很难记住&#xff0c;所以为了更好的掌握这个算法&#xff0c;所以在这篇文章中&#xff0c;将自己的学习过程记录下来&#xff0c;…

【JAVA】快速排序

快排&#xff0c;和冒泡排序一样&#xff0c;是同一类型的排序&#xff0c;都是交换排序 交换&#xff0c;涉及在遍历中比较&#xff0c;然后相互交换元素 冒泡排序是根据趟数两两比较&#xff0c;边比较边交换&#xff0c;快排也一样&#xff0c;不过冒泡是以顺序表的格式进…

快速排序Java代码实现

代码实现&#xff08;附注释&#xff09; import java.util.Arrays;public class Main {public static void main(String[] args) {int[] arr {9, 3, 7, 3, 6, 5, 3, 2, 1, 0};System.out.println("排序前&#xff1a;");System.out.println(Arrays.toString(arr))…

java 算法之快速排序

1、快速排序是一种比较高效的排序算法&#xff0c;采用“分而治之”的思想&#xff0c;通过多次比较和交换来实现排序&#xff0c;在一趟排序中把将要排序的数据分成两个独立的部分&#xff0c;对这两部分进行排序使得其中一部分所有数据比另一部分都要小&#xff0c;然后继续递…

快速排序(java实现)

高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢&#xff1f;那就是“快速排序”啦&#xff01;光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数&#xff08;不要被这…

(论文阅读)图像超分辨率的回顾与展望

(论文阅读&#xff09;图像超分辨率的回顾与展望 1 引言2 超分辨率技术的分类2.1 多图像超分辨率2.2 视频超分辨率2.3 单图像超分辨率2.3.1 基于插值的单图像超分辨率算法2.3.2 基于重建模型的单图像超分辨率算法2.3.3 基于学习的单图像超分辨率算法 3 基于深度学习的单图像超分…

【图像超分辨率重建】——EnhanceNet论文精读笔记

2017-EnhanceNet: Single Image Super-Resolution Through Automated Texture Synthesis(EnhanceNet) 基本信息 作者&#xff1a; Mehdi S. M. Sajjadi Bernhard Scholkopf Michael Hirsch 期刊&#xff1a; ICCV 引用&#xff1a; * 摘要&#xff1a; 单一图像超分辨率是指从…

图像超分辨率

参考&#xff1a;https://zhuanlan.zhihu.com/p/31664818 SRCNN: 《Learning a Deep Convolutional Network for Image Super-Resolution》 网络框架为&#xff1a;9*9*64(f19,n164),1*1*32(n232),5*5*1(f35) 所用的损失函数为&#xff1a; 该网络和传统方法的稀疏编码来超分…

SRGAN——使用与超分辨率重建的GAN

SRGAN数据GAN理论在超分辨率重建&#xff08;SR&#xff09;方面的应用。 一、超分辨率技术 1.SR技术介绍 SR技术&#xff0c;是指从观测到的低分辨率图像重建出相对应的高分辨率图像&#xff0c;在监控设备、卫星图像和医学影像等领域都有重要的应用价值&#xff0c;也可以应…

OpenCV中的超分辨率

文章目录 介绍OpenCV中的超分辨率EDSRESPCNFSRCNNLapSRN结果结论 介绍 超分辨率是指放大或改善图像细节的过程。请关注此博客&#xff0c;以了解OpenCV中“超分辨率”的选项。当增加图像的尺寸时&#xff0c;需要以某种方式插入额外的像素。基本的图像处理技术无法提供良好的效…

超分辨率IMDN

Lightweight Image Super-Resolution with Information Multi-distillation Network IMDB模块&#xff0c; class IMDModule(nn.Module):def __init__(self, in_channels, distillation_rate0.25):super(IMDModule, self).__init__()self.distilled_channels int(in_channels …

学习盲图像超分辨率的退化分布

学习盲图像超分辨率的退化分布 文章目录 学习盲图像超分辨率的退化分布摘要前言2、相关工作基于预定义的退化基于学习的退化 3、学习退化过程的分布3.1 核模型3.2 噪声模型3.3 概率退化模型3.4 盲SR统一的框架 4、实验4、1 实验设置4.2 与其他方法比较4.2 与其他方法比较 论文 …

超分辨率重建基础知识总结

超分辨率重建基础知识总结 1、为什么使用超分辨率重建&#xff1f;2、经典图像插值算法有哪些&#xff0c;局限在哪里&#xff1f;3、进行超分辨率重建的方式有哪些?4、超分辨率重建技术与图像复原技术区别与联系&#xff1f;5、SR常用的评价指标基于重建的方法基于学习的图像…

ELAN超分辨率

ELAN&#xff1a;将超分网络SwinIR高效化&#xff0c; https://github.com/xindongzhang/ELAN pip install pytorch-msssim -i https://pypi.tuna.tsinghua.edu.cn/simple pip install pyyaml -i https://pypi.tuna.tsinghua.edu.cn/simple pip install tqdm -i https://pypi…

超分辨率论文阅读

残差卷积注意力超分 VDSR、ESPCN 等方法表明:网络深度的加深对超 分辨率图像重建质量有至关重要的影响。但训练深度 卷积神经网络难以收敛,在训练过程会出现梯度消失和 梯度爆炸等问题。同时,未完全考虑到图像全局上下文 的信息对提取区域的影响,没有重点关注到图像边缘和…

图像超分辨率重构实战

低分辨率图像重建 任务总览数据加载与配置模型设置生成、判别、特征提取模块调用损失函数与训练测试 今天我们来介绍利用对抗生成网络&#xff08;GAN&#xff09;对低分辨率图像进行重构的介绍。再开始今天的任务之前&#xff0c;给大家强调一下&#xff0c;我们需要使用1.x.x…

图像超分辨率重建

文章目录 一、前言二、网络详解2.1 FSRCNN2.2 ESPCN2.3 VDSR2.4 EDSR2.5 SR-GAN 一、前言 写这篇文章&#xff0c;主要看了NTIRE 图像复原(Image Restoration)。挑战赛上超分辨率赛道上一些优胜队伍的方法。在这里跟大家分享下&#xff0c;如有错误的地方&#xff0c;还请指正…

图像超分辨率重建概述

1. 概念&#xff1a; 图像分辨率是一组用于评估图像中蕴含细节信息丰富程度的性能参数&#xff0c;包括时间分辨率、空间分辨率及色阶分辨率等&#xff0c;体现了成像系统实际所能反映物体细节信息的能力。相较于低分辨率图像&#xff0c;高分辨率图像通常包含更大的像素密度、…

深度学习用于图像超分辨率重建综述——超分辨率(一)

文章目录 Deep Learning for Image Super-resolution: A Survey超分辨简介最新进展1. 超分网络的升采样结构2. 可学习的升采样方法3. 全局和局部网络结构设计4. 损失函数设计5. 批归一化6. 课程学习7. 多级监督8. 其他网络设计和学习策略9. 无监督图像超分辨率10. 超分在专有领…

单图像超分辨率重建总结

单图像超分辨率重建总结 定义 单图像超分辨率重建&#xff08;Single Image Super-resolution Reconstruction&#xff0c;SISR&#xff09;旨在从给定的低分辨率&#xff08;LR&#xff09;图像中&#xff0c;重建含有清晰细节特征的高分辨率&#xff08;HR&#xff09;图像…