Java数据结构之《快速排序》(难度系数85)

news2024/9/24 13:14:40

一、前言:

  这是怀化学院的:Java数据结构中的一道难度中等(偏难理解)的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完,并成功实现,会陆续更新,记得三连哈哈! 所有答案供参考,不是标准答案,是博主自己研究的写法。(这一个题书上也有现成类似的代码,重要的是理解它的算法原理!)

二、题目要求如下: 

(第 18 题) 快速排序(难度系数85)

快速排序的核心操作是划分,通过某个数据将原来排序表分成两部分,前面部分比该数小,后面数据比该数据大或相等,该位置就为某数据排序后的位置,即该数据完成排序。如果定义一个排序表的划分方法为:

      int partition(int[] R,int low,int high);     其中,low,high表示将数据R的第low个数据到high个数据进行划分,返回到整数为划分后到支点存储的位置;快速排序在查找分支点位置的方法有多种,本题目的排序过程中,首先从右向左移动,搜索小于分支记录的第一个元素,再从左向右移动,搜索大于分支记录的第一个元素,交互该两个记录值,继续搜索,直到两个搜索点交汇,如果交汇点记录与分支记录相等,分支记录与交汇点数据不交换,分支位置为交汇位置; 完成划分方法后,通过递归调用完成快速排序:

     void QuickSort(int[] R,int s,int t){

           if(s<t) {

              int i=partition(R,s,t);

              QuickSort(R,s,i-1);

               QuickSort(R,i+1,t);

          }

     }

     建议每次划分选择第一个元素为支点记录进行编程。给你到问题是,将标准输入的n个整数采用快速排序,并需要显示出每次划分分支点存储的位置,第一个数为0,分支点的输出顺序按照程序递归产生的分支点的先后进行输出,并完成该数据的排序。

输入:标准输入,输入的第一行为整数的个数n值,第二行为n个整数,每个整数之间为一个空格。

输出:标准输出,输出的第一行依次输出排序过程中使用的支点位置,每个输出数据之间使用一个空格隔开,第二行输出排序后的序列,每个输出数据之间使用一个空格隔开。

输入样例:

14

39 80 76 41 13 29 50 78 30 11 100 7 41 86

输出样例:

5 3 2 1 8 6 9 13 12 10

7 11 13 29 30 39 41 41 50 76 78 80 86 100

补充:题目意思一定要深度揣摩一下,没有提示就得自己根据它题目给的输入输出来推一下原理了,不然就是盲目下手出错很多!这个题它给出了递归调用的方法,那只要研究怎么进行快速排序就行,然后注意它的题目要求。

三、代码实现: (代码的做题原理全部在代码注释中,若还有疑问也可以翻数据结构书关于快速排序的基本原理的内容) 

补充:应该当你放到考试系统里检测代码是否正确时,请把所有的代码注释去掉!不过是自己的编译器应该没问题的

(1)为了方便,就没有去专门写一个快速排序类然后在测试类去调用它的排序方法,而是全部写在一个类里,它里面的排序方法,以及主方法都在该类中。

package com.fs.sort;

import java.util.Scanner;

public class Main {
    public void quickSort(int[]data){
        //从0开始,到最后数组的最后一个数的下标
        quickSort(data,0,data.length-1);
    }
    //low:意思是拿来比较的基值的下标,high:表示从右往左遍历与基值比较大小
    public void quickSort(int[]data,int low,int high){
        //由题目给的方法:只要满足low小于high那就要继续划分
        //每次产生的分支点输出后并返回过来继续按照分支点分成两个部分来快速排序
        if(low<high) {
            int branch_point = point(data, low, high);
            quickSort(data,low,branch_point-1);
            quickSort(data,branch_point+1,high);
        }

    }
    //这里是用来快速排序和找到交汇点并返回分支点的位置
    public int point(int[]data,int low01,int high01) {
        //每次快速排序的基准值(也就是对比值,默认每次都是第一个元素)
        int base = low01;  //除了刚开始的默认值下标会是0,其他进行第n次拆分的会变化
        //默认从左边向右边遍历时第一个值的下标(当然是基值下标开始:low那个开始)
        int i = low01;
        //默认从右边向左边遍历时最后一个值的下标(当然是从下标:data.length-1那里开始)
        int j = high01;
        //从左向后遍历 与从右向前遍历时只要下标不自增到相等,就进行他们各自当前位置的下标值与基值比较
        //从左向右:只要保证(i<j),且data[i]<=data[base](也就是比基值小或相等)i++,向后移动。且当i,j都固定时(而且i<j)要交换i与j位置的元素,这样两边才能继续向中间遍历,直到i==j为止
        //从右向右:只要保证(i<j),且data[j]>=data[base](也就是比基值大或相等)j--,向前移动。且当i,j都固定时(而且i<j)要交换i与j位置的元素,这样两边才能继续向中间遍历,直到i==j为止
        //这样写的作用就是把一部分大的数值放后面,小的数值放前面
        int temp;
        while (i < j) {
            while ((j > i) && (data[j] >= data[base])) {
                --j;
            }
            while ((i < j) && data[i] <= data[base]) {
                ++i;
            }
            //每次i,j自增完(只要还满足i<j)都要把那他们互相交换位置,因为这是把大的值放到后面,小的值放在前面
            if (i < j) {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }
        //当i与j自增到退出前面循环时,也就是它们在同一位置时,判断这个位置下标的值与基值比较,如果大于基值不用交换,小于基值:就把基值的位置与该(i==j)下标的位置交换
        if (data[base] > data[i]) {
            temp = data[base];
            data[base] = data[i];
            data[i] = temp;
        }
        //题目要求输出的每次的分支点位置:
        System.out.print(i + " ");
        return i;
    }

    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int n=sc.nextInt();  //所要排序的整数个数
        int []data=new int[n];
        for(int i=0;i<n;i++){
            data[i]=sc.nextInt();
        }
        Main m = new Main();
        m.quickSort(data);
        System.out.println();  //控制在下一行
        for(int k=0;k<n;k++){
            System.out.print(data[k]+" ");
        }
    }
}

 四、代码测试运行结果: 

<1>题目上的测试输入样例:

<2> 我就用书上的测试样例:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1285226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络层之无分类编址CIDR(内涵计算例题)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

leetcode:对称二叉树

题目描述 题目链接&#xff1a;101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 题目分析 题目中说至少存在一个节点&#xff0c;所以我们只需要对比左右子树 写一个子函数对比左右子树&#xff1a;用递归的思路&#xff0c;左子树的左子树和右子树的右子树对比&…

苹果电脑录屏神器,让你的录制更加轻松

“苹果电脑可以录屏吗&#xff1f;老师布置了一份作业&#xff0c;需要用到视频作为材料&#xff0c;现在我找到素材了&#xff0c;但是不知道怎么录制下来&#xff0c;非常头疼&#xff0c;大家知道苹果电脑怎么使用录屏功能吗&#xff1f;” 苹果电脑一直以其出色的性能和简…

6.17验证二叉树(LC98-M)

算法&#xff1a; 中序遍历下&#xff0c;输出的二叉搜索树节点的数值是有序序列。 有了这个特性&#xff0c;验证二叉搜索树&#xff0c;就相当于变成了判断一个序列是不是递增的了。 具体地&#xff1a;中序遍历时&#xff0c;判断当前节点是否大于中序遍历的前一个节点&a…

IntelliJ IDEA 智能(AI)编码工具插件

文章目录 通义灵码-阿里CodeGeeX-清华大学智谱AIBitoAmazon CodeWhisperer-亚马逊GitHub Copilot - 买不起CodeiumAIXcoder 仅仅自动生成单元测试功能 TestMe插件&#xff08;免费&#xff09;仅仅是模板填充&#xff0c;不智能。 Squaretest插件&#xff08;收费&#xff09;…

奇客数据恢复评论:优点、缺点和个人的结论

小型、中型和大型公司以数字格式存储大量信息。数据范围包括患者或客户信息、工资数据、联系人列表、电子邮件通信、有关个人工作和项目的各种数据以及电子表格。丢失这些数据和文件对于任何公司来说都是灾难性的。恢复这些数据对于业务的正常功能来说非常重要。 由于存在许多…

任务管理器快捷键分享!这些知识很有用!

“我刚学习使用电脑没多久&#xff0c;想问问大家任务管理器这个功能有什么用处呀&#xff1f;在使用任务管理器时有什么快捷键能快速进入吗&#xff1f;感谢解答&#xff01;” 在日常使用电脑的过程中&#xff0c;我们经常需要打开任务管理器来进行一些操作。而掌握任务管理器…

uniapp 之 短信验证码登录

一、需求 输入手机号码&#xff0c;可以获取验证码。 二、实现效果 点击前&#xff1a; 点击后&#xff1a; 三、代码实现 <template><view class"login"><view class"infobox"><view class"item"><input type…

CCleaner2024电脑中文最新免费版5.66

CCleaner是一款小型&#xff0c;快速&#xff0c;专业的系统清理和隐私保护工具。没有最低内存或硬盘驱动器要求。可使电脑启动速度最高提速53%&#xff0c;不包含任何广告软件。不仅可以清除系统中的垃圾文件和使用者的历史记录和Cookie&#xff0c;更能删除保留在计算机的Coo…

深入剖析Java Web开发中的过滤器、拦截器和AOP

文章目录 1. 过滤器&#xff08;Filter&#xff09;1.1 过滤器的概念1.2 过滤器的应用场景1.3 过滤器的示例代码 2. 拦截器&#xff08;Interceptor&#xff09;2.1 拦截器的概念2.2 拦截器的应用场景2.3 拦截器的示例代码 3. AOP&#xff08;面向切面编程&#xff09;3.1 AOP的…

element UI改写时间线组件为左右分布

2023.12.4今天我学习了如何使用element的时间线组件&#xff0c;效果如&#xff1a; 代码如下&#xff1a;&#xff08;关键代码 v-if"item.send_type"&#xff09;判断左右分布情况。因为如果没有这个判断的话&#xff0c;其实会两边都有显示。可以用一个判断表示0显…

SQL Sever 基础知识 - 数据筛选(2)

SQL Sever 基础知识 - 四、数据筛选 第3节 NULL3.1 NULL 和三值逻辑3.2 IS NULL / IS NOT NULL 第4节 AND4.1 AND 运算符简介4.2 AND 运算符示例4.2.1 一个 AND 运算符4.2.2 多个 AND 运算符4.2.3 将 AND 运算符与其他逻辑运算符一起使用 第5节 OR5.1 OR 运算符简介5.2 OR 运算…

RH850P1X芯片学习笔记-Overview

文章目录 Outline产品列表功能框图特点Pin和引脚功能CPU系统CPUFPU浮点运算单元中断处理保护机制指令缓存Local RAMGlobal RAM处理器间通信和相互排斥机制 操作模式中断功能DMA电源供电Reset控制单元时钟控制单元CSIH-SPIMCAN看门狗计时器系统计时器GTM通用定时器模块外设互联P…

vue3 vue-router过渡动效 滚动行为 (四)

文章目录 一、过渡动效1.1安装animate.css1.2 利用元信息存储过渡名称1.3 在组件中使用 二、滚动行为2.1 始终滚动到顶部2.2 相对于某个元素的偏移量2.3 保持之前的滚动位置 一、过渡动效 1.1安装animate.css npm install animate.css --save1.2 利用元信息存储过渡名称 {pa…

【Element】el-table组件使用summary-method属性设置表格底部固定两行并动态赋值

一、背景 需求&#xff1a;在表格账单中底部添加两行固定行&#xff0c;来统计当前页小计和总计。element ui 官网上是直接将本列所有数值进行求合操作的&#xff0c;且只有固定一行总计。目前的需求是将接口返回的数据填充到底部固定的两行中 二、底部添加两行固定行 2.1、…

一元月老盲盒交友小程序源码系统 源码全部开源可二次开发 附带完整的搭建教程

传统的交友平台存在很多问题&#xff0c;如信息不透明、虚假信息等。这些问题不仅影响了用户的交友体验&#xff0c;也损害了交友平台的信誉。为了解决这些问题&#xff0c;罗峰给大家介绍一款一元月老盲盒交友小程序源码系统。该系统结合了盲盒和交友两个元素&#xff0c;通过…

赛事回顾 | 首届“智航杯“全国无人机智能算法竞赛落幕

11月28日&#xff0c;首届“智航杯”全国无人机智能算法竞赛实物赛在海南省三亚市成功落下帷幕。此次竞赛自2023年4月启动以来&#xff0c;共有来自全国145所高等院校和50多所企事业单位的1253支团队、3655人报名参赛&#xff0c;最终有6支队伍脱颖而出&#xff0c;入围了实物赛…

IPD|企业产品研发的致胜法宝——TR技术评审

前言 企业产品研发过程中&#xff0c;我们总能听到类似这样一些声音&#xff1a; 技术评审效率太低&#xff0c;一开就是半天&#xff0c;也没啥结果&#xff1b; 团队里都是技术骨干&#xff0c;不用评审了&#xff1b; 已有决策评审了&#xff0c;技术评审就是浪费时间&a…

如何将四元数转换为旋转矩阵

什么是四元数&#xff1f; 四元数是表示物体在三维空间中的方向和旋转的几种数学方法之一。另一种方法是使用基于欧拉角的旋转矩阵&#xff0c;即滚动、俯仰和偏航&#xff0c;就像的封面图片。 通常使用四元数代替欧拉角旋转矩阵&#xff0c;因为“与 旋转矩阵相比 &#xff…

备考软件测试

单元测试 语句覆盖所有条件执行一次 判定覆盖所有条件错一次对一次 条件覆盖小条件对错各一次 判断条件覆盖每个小条件对错各一次的基础上再加上两个大条件对错各一次 多条件覆盖(组合覆盖) 每个小条件对应另一个小条件要对一次错一次比如:A<5对一次要对应B5对一次错一次…