java数据结构与算法基础-----排序------快速排序

Java经典算法之快速排序算法 快速排序是一种分治法(Divide and Conquer)的排序算法,由英国计算机科学家Tony Hoare于1960年提出。其基本思想是通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有元素均比另一部分的元素小,然后分别对这两部分继续进行排序,最终达到整个序列有序的效果。 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846
  1. 快速排序是冒泡排序的改进版。依然采用分治思想,先通过一趟排序将数据分割成两部分,其中一部分的所有数据要比另一部分的所有数据要小,然后再按此方法,对这两部分数据分别进行快速排序,整个过程可以用递归实现。
  2. 就是拿到一组数据,先找一个数,作为中间数(你可以直接拿序列中间的数,或者拿最后一个数,或者第一个数),然后依据此数,先排成两组,不用有序,就是比中间数大的,分为一组,比中间数小的,分为一组,中间数最后归哪组,随意,不归任何一组也可以。然后分别对这两组再进行快速排序(就像冒泡一样,每次把中间数冒出去)
    在这里插入图片描述
  3. 实现思路与运行效果
  1. 首先,我们选择中间数(基准数),我们这里指定序列的第一个数是基准数,将基准数保存。然后创建两个下标,分别位于序列的最左面和最右面,依次从右边找大于中间数的值,将其放在左边,左边找小于中间数的值,放在右边,最后,左边下标最后的位置,就是中间,将中间数放进去即可
    在这里插入图片描述
  1. 代码第一版
import java.util.Arrays;
import java.util.Date;

public class Test {
    public static void main(String[] args) {
        int arr[]= {8,9,1,7,2,3,5,4,6,0};
        int arr1[]={-9,78,0,23,-567,70, -1,900, 4561};

        System.out.println("原序列为:"+ Arrays.toString(arr));

        quickSort(arr,0,arr.length-1);
        print(arr);

        System.out.println("原序列为:"+ Arrays.toString(arr1));

        quickSort(arr1,0,arr1.length-1);
        print(arr1);

        System.out.println("=================================80000组数据测试======================");
        int array[] = new int[80000];
        for (int i = 0 ;i<80000;i++){//生成80000个[0,8000000)的随机数
            array[i] = (int) (Math.random()*800000);
        }
        long start = new Date().getTime();
        quickSort(array,0,array.length-1);
        long end = new Date().getTime();
        System.out.println("消耗时间"+(end-start));

    }

    /**
     * 快速排序
     */
    public static void quickSort(int[] a, int left, int right) {
         if (left < right) {//如果l>r表示已经排完,可以出递归了
                 int l = left;//左下标
                 int r = right;//右下标
                 int temp = a[l];//保存一个指标变量
                 while (l < r) {//如果l>=r时,退出循环,表示排完

                     while(l < r && a[r] > temp)//从右向左遍历找小于temp的数,但是不能越过l
                         r--; // 从右向左找第一个小于temp的数

                     if(l < r)//如果上面循环结束,依然l<r,表示满足交换条件
                         a[l++] = a[r];//将右边第一个小于temp的数放在左边,因为上面temp保存了值,不用担心覆盖。相当于a[l]=a[r];     l++;  两条语句的简写形式,

                     while(l < r && a[l] < temp)//从左向右遍历找大于temp的数,但是不能越过r
                         l++; // 从左向右找第一个大于temp的数

                     if(l < r)//如果上面循环结束,依然r>l,表示满足交换条件
                         a[r--] = a[l]; //将左边第一个大于temp的数,放在右边,因为它的值已经移动到左边了,不用担心覆盖
                 }
                 a[l] = temp;//最后l下标所在位置,就是temp最终可以确定的位置
                 quickSort(a, left, l-1); /* 递归调用 */
                 quickSort(a, l+1,right); /* 递归调用 */
            }
     }
    /**
     * 打印
     */
    public static void print(int arr[]){
        System.out.print("排序后为:");
        for(int i = 0;i<arr.length;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}
  1. 代码第二版
/**快速排序,不稳定,时间复杂度O(n * logn) 空间复杂度O(n*logn)
     * 这里是快排入口
     */
    public void quickSort(int arr[]){
        quickSort(arr,0,arr.length-1);
    }

    /**
     * 递归主要用于分割左右两个表
     */
    public void quickSort(int arr[],int low,int high){
        if(low<high){//如果左指针超过右指针,表示本次比较完成
            //快速排序,每一趟都会确定一个元素的最终位置,用pivot表示,pivot是枢纽的意思
            int pivotPosition = quickSortPartition(arr, low, high);
            //由pivot为分界点,分成左右两个表
            quickSort(arr,low,pivotPosition-1);//左表排序
            quickSort(arr,pivotPosition+1,high);//右表排序
        }
    }

    /**
     * 这里是每一趟的快速排序代码,指定一个元素作为枢纽pivot,然后以它为中心,小的元素放在它左边,大的放在它右边
     */
    public int quickSortPartition(int arr[],int low,int high){
        int pivot = arr[low];//指定枢纽
        while (low<high){
            while(low<high && arr[high]>=pivot) --high;//从右边找到比枢纽小的
            arr[low] = arr[high];//放在左边
            while(low<high && arr[low]<=pivot) ++low;//从左找到比枢纽大的
            arr[high] = arr[low];//放在右边
        }
        arr[low] = pivot;//最终将枢纽放到它最终的位置
        return low;//最终low指向枢纽最终位置
    }
【排序算法】快速排序原理及Java实现 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的。快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录从后面直接移动到前面,从而减少了总的比较次数和移动次数。同时采用“分而治之”的思想,把大的拆分为小的,小的拆分为更小的,其原理如下: 阅读详情

相关推荐

AcWing算法基础课-785快速排序-Java题解

这篇文章介绍了使用快速排序算法对整数数列进行排序的方法,包括选择基准元素、分区操作和递归排序子数组。通过详细的步骤和示例,解释了快速排序的过程及其非稳定性特征,并提供了相应的 Java 代码实现。

何书悦的技术博客 4117

java 实现快速排序

1.介绍 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序 过程可以递归进行,以此达到整个数据变成有序序列。 2.切分原理 切分原理: 把一个数组切分成两个子数组的基本思想: 1.找一个基准值,用两个指针分别指向数组的头部和尾部; 2.先从尾部向头部开始搜索一个比基准值小或等于的元素,搜索到即停止,并记录指针的位置; 3.再从头部向尾..

m0_46306264的博客 1万+

大模型应用开发面试全流程实录:RAG、上下文工程与多Agent协作技术深度解析

Transformer 依靠多头自注意力和位置编码实现高效序列建模。Prompt Engineering包含多种设计思路,如 Zero-shot、Few-shot、Chain-of-thought,提升模型泛化和推理。Token 和上下文窗口直接影响模型性能与成本,选择需结合实际业务场景(如客服对话需长窗口)。Embedding 技术是 RAG 的基础,决定了语义检索效果。向量数据库如 FAISS、Milvus等分别适用于本地/分布式检索。

m0_52114506的博客 828

【Java】快速排序

本文介绍了快速排序的原理优点,以及如何选取基准元素,交换元素的方法等。

zcxyywd的博客 2万+

BL0910-从零到一:多路交/直流电能计量的实战配置与校准

本文详细介绍了BL0910芯片在多路交直流电能计量中的实战应用。从硬件连接、SPI通信配置,到软件初始化、核心寄存器设置,再到偏置与增益校准,提供了完整的配置与校准指南。文章重点阐述了直流测量模式的切换要点及数据读取的工程化处理,帮助开发者快速实现高精度、多通道的电能监控方案。

rice5的博客 567

setup time和hold time的计算

内容仅仅为了方便记忆,与原理无关

sddhyl的博客 7819

Java 快速排序

快速排序是一种常用的基于比较的排序算法,其时间复杂度为 O(nlogn),并且具有稳定性和广泛的应用场景。本文将全面详细的讲解一下 Java 中快速排序算法的原理、实现以及时间复杂度等问题。

兴趣是最好的老师,勤能补拙 1万+

避开这些坑,你的Python爬虫才能稳定爬取IEEE Xplore(含反爬策略与MongoDB存储实战)

本文详细介绍了如何构建稳定的Python爬虫系统以爬取IEEE Xplore学术论文,包括反爬策略、MongoDB存储优化和断点续传机制。通过动态等待时间算法、请求头指纹管理和会话保持策略,有效应对IEEE的反爬机制。同时,优化MongoDB数据结构和索引,提升存储效率。最后,强调法律合规与伦理考量,确保爬虫合法合规运行。

weixin_29031057的博客 1096

数据结构与算法基础-快速排序(Java)

import java.util.Arrays; /** * @author lixin * @date 2019/3/15 - 21:14 */ public class QuickSort { public static void main(String[] args) { int[] arr = new int[]{1, 3, 4, 5, 2, 7, 6, 4...

每天都要加油鸭 145

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1009

Java写一条吃满屏幕的贪吃蛇(A*自动寻路算法和一些简单的策略) 二

上一篇文章介绍了一条贪吃蛇的简单实现,这一篇介绍贪吃蛇的自动寻路算法 ,说是自动寻路其实也就是一种遍历地图的算法,如果玩过游戏肯定知道游戏里面一般会有自动寻路功能,贪吃蛇的自动寻路算法也就是实现这个功能。下面慢慢介绍这种算法吧。    最开始,我没有在网上找资料的时候,我对于设计寻路算法的看法是遍历整个地图,将障碍物做上标记,然后找一条能够到达目的地的线路就可以了。所以最开始我用了特别暴力的方式来...

Sober_yang的博客 3633

数据结构排序算法

直接插入排序(Insertion Sort)是一种简单的排序算法,其主要思想是把待排序的元素插入到已经排好序的部分中,从而得到一个新的有序序列。直接插入排序的时间复杂度为,其中 n 表示数组的长度。当数组已经有序时,时间复杂度为 O(n)。关于比较次数,最坏情况下,即待排序的序列为逆序时,直接插入排序的比较次数最多。具体来说,对于长度为 n 的数组,最坏情况下的比较次数为 ,即大约为。在最好情况下,即待排序的序列已经有序时,直接插入排序的比较次数仅为 n-1。

qq_61726001的博客 1556

车辆网络安全ISO/SAE 21434解读(一)概述

ISO/SAE 21434 《道路车辆 网络安全工程》是SAE和ISO共同制定的一项针对道路车辆的网络安全标准,它是一个面向汽车行业全供应链(OEM及各级供应商)的车辆网络安全管理指导文件

xiaoxiabang的博客 8427

Java数据结构与算法——排序篇

Java数据结构与算法: https://blog.youkuaiyun.com/weixin_46822367/article/details/115478461?spm=1001.2014.3001.5502. 目录1、==冒泡排序==2、选择排序3、插入排序4、希尔排序5、==快速排序==6、归并排序7、基数排序8、堆排序 1、冒泡排序 package com.lyp.sort; import java.text.SimpleDateFormat; import java.util.Arrays; impo.

weixin_46822367的博客 258

IT:银行类金融科技岗笔试习题集合—四个模块包括【综合知识+EPI+英语+个性测评】持续更新,建议收藏

IT:银行类金融科技岗笔试习题集合—四个模块包括【综合知识+EPI+英语+个性测评】 导读:行测、综合知识、英语和性格测试。综合知识,包括货币学、金融、会计、计算机等内容。  行政能力测试,内容大家可以参考公务员考试,包括逻辑推理、数字推理、图形推理、文字推理。英语测试,包括语法和词汇30题、完型填空20题、10篇阅读理解50题,阅读理解文章特别长,生词特别多。 (1)、英语可以Ctrl+F...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 2万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

用Java语言实现快速排序

import java.util.Scanner; public class QuickSort_2 { public static int [] quick_sort_1(int []a,int l,int r){ if(l>=r){ return null; } int i = l-1; int j = r+1; int x = a[l]; while(.

m0_57755486的博客 147

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

数据结构与算法基础(Java)

数据结构与算法基础(Java) 文章目录数据结构与算法基础(Java)1.数据结构1.1存储结构1.2逻辑存储2.算法2.1特性2.2基本要求3.线性结构3.1数组3.1.1数组的基本使用3.1.2数组元素的添加3.1.3数组元素的删除3.1.4面向对象的数组3.1.5线性查找3.1.6数组的二分法查找3.2栈3.3队列3.4单链表3.4.1删除单链表节点3.4.2单链表节点插入3.5循环链表3.6双向循环链表4.递归4.1斐波纳切数列4.2汉诺塔5.排序算法5.1时间复杂度5.2交换排序5.2.1数组冒泡

小宇的博客 645

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java面试:算法与数据结构的深度探讨

本次面试通过层层深入的提问,全面考察了候选人在算法和数据结构方面的技术能力。候选人的回答不仅展现了扎实的理论基础,还体现了丰富的实战经验。面试官对候选人的表现给予了高度评价,认为其是团队中不可多得的技术人才。

南客先生的博客 468

快速排序Java代码简洁实现

学习过数据结构的同学们都知道,快速排序算法是一种时间复杂度为O(nlogn)的排序算法,在各种排序算法中算是较为高效的方法,企业面试中也经常有手撕快排的环节。本文将阐述算法的基本思想,并用Java代码的形式实现快速排序代码。 算法思想 快速排序主要采用分治的基本思想,每次将一个位置上的数据归位,此时该数左边的所有数据都比该数小,右边所有的数据都比该数大,然后递归将已归位的数据左右两边再次进行快...

技术进阶之路 4352

Java数据结构与算法基础(二)递归算法

Java数据结构与算法基础(二)递归算法Java数据结构与算法基础(一)概述与线性结构 主要内容: 一、算法相关概念 二、递归算法的学习与总结 三、递归算法的几个Java实现   1.斐波那契数列   2.汉诺塔问题   3.快速排序 一、算法相关概念   1.衡量算法的优劣方法:     ① 事后统计方法(靠运行时间衡量)     ② 事前分析估算方法(时间复杂度、空间复杂度)   2.一个...

Juwenzhe_HEBUT的博客 342

Java、C语言实现快速排序算法

代码: #include #include int   findpivot(); int   partion (); void  quicksort (); int main() {     int n,i;     printf("请输入需要排序的元素的个数:");     scanf("%d",&n);     int a[n];     for(i = 0;i

即使没人看我也要写 745

数据结构几种排序算法整理

最新整理书籍,无意间翻出大学时期数据结构课本,随便翻阅了其中关于排序这一章,粗略的看了下突然觉得比较陌生,作为计算机基础的东西,自己工作了反而用的比较少,平时自己也没有太关注,为了以后万一需要找工作方便复习这些东西,今写于此。 快速排序:快速排序是对冒泡排序的一种改进,冒泡排序是比较的相邻两个元素,故比较的次数以及元素移动的频率比较大。快速排序有效的改进了这一不足,比较的元素位置相隔比较远,...

cc4167的博客 203

数据结构与算法之基数排序

看完美团、字节、腾讯这三家的面试问题,是不是感觉问的特别多,可能咱们又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。开篇有提及我可是足足背下了1000道题目,多少还是有点用的呢,我看了下,上面这些问题大部分都能从我背的题里找到的,所以今天给大家分享一下互联网工程师必备的面试1000题。注意不论是我说的互联网面试1000题,还是后面提及的算法与数据结构、设计模式以及更多的Java学习笔记等,皆可分享给各位朋友互联网工程师必备的面试1000题而且从上面三家来看,算法与数据结构是必备不可少的。

weixin_42179304的博客 633

快速排序 java代码

作为一个程序员 不知道快速排序,不知其可也。快速排序的思路是,大千世界,有那么多人,那么多数。但所有的数,都和某个数去比较。这样就能保证,一半区域都是小于那个数的。 另一半都是大的。 这样就把大数据一份为2了。 再重复用这种方法。最终会遇到某两个数去相比较。每一个小家庭和谐了,那么整个社会就和谐了。多么伟大的思想。造就了这么好的算法。package bigo;public class quick

kunpengku 1275

算法基础--快速排序详解

我为什么复习算法? 算法是编程的灵魂,以前在学校的时候上数据结构,算法都是会的就写,不会就抄。刚出来找工作面试问的还是基础和算法,算法可以体现你的基础扎不扎实,一个聪明的脑子应该是看一遍算法描述就很快的写出来,我第一次面试的时候让我写快排(快速排序),哇,好熟悉,一写各种出错,趁毕业之前再来过一遍基础算法吧。 快速排序 快速排序(Quicksort)是对冒泡排序...

weixin_30399797的博客 85

排序算法之快速排序(java实现)

1 package com.javaTest300; 2 3 public class Test039 { 4 5 public static void main(String[] args) {// 快速排序 6 7 int a[]={2,3,8,10,5,1,8,78,35,12}; 8 9 System.out.printl...

weixin_30262255的博客 71
上一篇: java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树
下一篇: java数据结构与算法刷题-----LeetCode977. 有序数组的平方
ydenergy_殷志鹏
博客等级 码龄7年 5887粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值