【已解决】键盘输入数字-使用JAVA语言实现键盘输入的数字再通过快速排序算法输出

news2024/12/23 6:29:03

文章目录

  • 一、前言
    • 任务描述
    • 相关知识
      • 分治策略:
      • 编程要求
      • 测试说明
  • 二、具体代码实现
  • 总结


一、前言

—快速排序

任务描述

在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终位置后,整个数据序列被基准分割成两个子序列,所有小于基准的元素放置在前子序列中,所有大于基准的元素放置在后子序列中,并把基准排在这两个子序列的中间,这个过程称作划分。
  然后对两个子序列分别重复上述过程,直至每个子序列内只有一个记录或空为止。

本关任务:编写一个能使用快速排序的思想进行整数排序的小程序。

相关知识

如何求解?假设a[s] a[s+1] … … … a[t]待排序的元素。

在这里插入图片描述

分治策略:

  1. 分解:将原序列a[s…t]分解成两个子序列a[s…i-1]和a[i+1…t],其中i为划分的基准位置。
  2. 求解子问题:若子序列的长度为0或为1,则它是有序的,直接返回;否则递归地求解各个子问题。
  3. 合并:由于整个序列存放在数组中a中,排序过程是就地进行的,合并步骤不需要执行任何操作。

在这里插入图片描述

编程要求

根据提示,在右侧编辑器补充代码,实现快速排序。

测试说明

编辑器对你编写的代码进行测试:

测试输入:10,2,5,1,7,10,6,9,4,3,8;
预期输出:
排序前:2 5 1 7 10 6 9 4 3 8
排序后:1 2 3 4 5 6 7 8 9 10

测试输入:5,1,151,12,22,100;

预期输出:
排序前:1 151 12 22 100
排序后:1 12 22 100 151

二、具体代码实现

import java.util.Scanner;

public class QuickSort {
    public static void main(String[] args) {
    //键盘输入流的录入代码
        Scanner scanner = new Scanner(System.in);
        // 读取输入,返回值是一个整数型类型。
        int n = scanner.nextInt();
        int[] arr = new int[n];// 定义一个名字为arr的数组,数组里边的长度是n,也就是我们输入的数字。
        for (int i = 0; i < n; i++) {   // 对我们输入的数字大小的数组进行遍历,我们输入几就遍历循环几次。
            arr[i] = scanner.nextInt(); // 每循环一次就把输入的数字几放到数组的第几个位置,默认位置从1开始
        }
        // 显示排序前的数组
        System.out.print("排序前:");
        display(arr); // 定义的一个display的方法。
        // 快速排序
        quickSort(arr, 0, n - 1);
        // 显示排序后的数组
        System.out.print("排序后:");
        display(arr);
        scanner.close(); // scanner 键盘录入的操作很站系统资源所以需要调用close方法。
    }

    // 输出数组
    public static void display(int[] arr) {
        for (int num : arr) {    // 每输入一个就空一个
            System.out.print(num + " ");
        }
        System.out.println(); // 换行
    }

    // 划分算法,定义一个划分的方法,参数传需要对那个数组进行操作,最低位,和最高位。
    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[low]; // 最低位的数组赋给基准变量pivot
        // 选择基准
        int left = low + 1; // 每次最低位加一依次往右移动
        int right = high; // 默认初始值是最高位在最右边的数right
        while (left <= right) {  // 一个while循环判断最低位+1的数是否小于等于右边的数
            // 找到大于基准的左边元素,核心代码,比基准元素大的但是在右边     
            while (left <= high && arr[left] <= pivot) {
                left++;
            }
            // 找到小于基准的右边元素
            while (right >= low + 1 && arr[right] >= pivot) {
                right--;
            }
            // 交换
            if (left < right) {
                swap(arr, left, right);
            }
        }
        // 将基准元素放到正确的位置
        swap(arr, low, right);
        return right;
        // 返回基准的最终位置
    }

    // 交换数组元素,交换位置。
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i]; //定义的一个中间变量用来交换
        arr[i] = arr[j]; 
        arr[j] = temp;
    }

    // 快速排序
    public static void quickSort(int[] arr, int low, int high) {
        if (low < high) {
            int pivotIndex = partition(arr, low, high);
            // 获取基准位置
            quickSort(arr, low, pivotIndex - 1);
            // 对左子序列进行排序
            quickSort(arr, pivotIndex + 1, high);
            // 对右子序列进行排序
        }
    }
}

总结

  1. 选择一个基准值(pivot),通常可以选择数组的第一个元素、最后一个元素或者中间元素。
  2. 对数组进行划分,将小于基准值的元素放在基准值左边,大于基准值的元素放在基准值右边。
  3. 分别对左右两个子数组重复上述步骤,直到子数组的长度为 1 或 0。

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

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

相关文章

css如何设置间距

在CSS中设置间距是非常常见的需求&#xff0c;可以通过多种属性来实现。以下是一些常用的CSS属性及其用法&#xff0c;用于设置元素之间的间距&#xff1a; 内边距&#xff08;Padding&#xff09; padding 属性用于设置元素内容与元素边框之间的距离。可以分别设置四个方向的…

RTR_Chapter_6 上

第六章 纹理 表面纹理&#xff08;texture&#xff09;是指其外观和给人的视觉感受&#xff0c;就像是一幅油画的图案一样。而在计算机图形学中&#xff0c;纹理化则指的是一个过程&#xff0c;即通过使用一些图像、函数或者其他数据&#xff0c;来对每个表面位置的外观表现进行…

高德地图矢量图形点击事件生成

官方文档https://lbs.amap.com/demo/javascript-api-v2/example/overlay-editor/polylineeditor 生成矢量图形如上&#xff0c;代码如下 const markerAddof ref(false) // 绘图 function drawMark () {if (!markerAddof.value) {//限制矢量图形点击只显示一个if (cameraId.va…

Discord邀请Midjourney机器人失败?教你一招解决

最近小鲨在使用Midjourney的过程中&#xff0c;遇到一个问题&#xff1a; Discord在邀请Midjourney机器人的时候&#xff0c;报错&#xff1a; Unable to accept invite&#xff08;无法接受邀请&#xff09; 因为Midjourney目前&#xff0c;主要还是在Discord里使用。 如果D…

【docker】在IDEA工具内,远程操作服务器上的docker

一&#xff0c;配置 在服务器上&#xff0c;对docker配置如下内容&#xff1a; vi /usr/lib/systemd/system/docker.service添加如下&#xff1a; -H tcp://0.0.0.0:2375重新加载&#xff0c;并重启docker&#xff1a; #重新加载配置 systemctl daemon-reload# 重启docker …

双路创新深度学习!TCN-Transformer+LSTM多变量时间序列预测(Matlab)

双路创新深度学习&#xff01;TCN-TransformerLSTM多变量时间序列预测&#xff08;Matlab&#xff09; 目录 双路创新深度学习&#xff01;TCN-TransformerLSTM多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab…

肾癌的多模态预测模型-临床-组织学-基因组

目录 摘要 技术路线 ① lncRNA的预测模型 ②病理 WSI 的分类器 ③临床病理分类器 模型结果 与别的模型比较 同行评审学习 1&#xff09;使用lncRNA的原因 2&#xff09;模型临床使用意义 3&#xff09;关于截止值的使用 摘要 A multi-classifier system integrated…

51.字符串比较实例-用户登录

//已知正确的用户名和密码&#xff0c;请用程序实现模拟用户登录 //总共三次机会&#xff0c;登录之后给出相应的提示 import java.util.Scanner;public class 登录 {public static void main(String[] args) {//1.定义两个变量&#xff0c;记录正确的用户名和密码String righ…

红黑树:强大的数据结构之插入详解,附图

一、红黑树概述 红黑树是一种自平衡二叉查找树&#xff0c;具有以下性质&#xff1a;节点要么是红色要么是黑色&#xff1b;根节点是黑色&#xff1b;每个叶子节点&#xff08;NIL 节点&#xff09;是黑色&#xff1b;每个红色节点的两个子节点都是黑色&#xff1b;从任一节点到…

【已解决】ElementPlus 的 el-menu 组件如何用 js 控制展开某个子菜单,并在其他组件中控制使用呢?

文章目录 需求几次探索官网寻找线索&#xff08;解决办法&#xff09; 需求 我如何用代码来实现 ElementPlus 的菜单的展开和收缩呢&#xff1f; 几次探索 尝试通过找到节点之后&#xff0c;使用 click 事件&#xff0c;失败了 // 伪代码如下 const handleFindNodeAndClick …

【数据结构】散列(哈希)表简单介绍

散列表也叫做哈希表&#xff08;Hash table&#xff09;&#xff0c;散列表通过关键码和存储地址建立唯一确定的映射关系&#xff0c;能够快速查找到对应的元素&#xff0c;排序算法中的计数排序就是一种利用哈希进行排序的算法。 一、散列表的概念 散列表&#xff08;Hash ta…

【优选算法之前缀和】No.6--- 经典前缀和算法

文章目录 前言一、前缀和例题模板&#xff1a;1.1 【模板】前缀和1.2 【模板】⼆维前缀和1.3 寻找数组的中⼼下标1.4 除⾃⾝以外数组的乘积1.5 和为 K 的⼦数组1.6 和可被 K 整除的⼦数组1.7 连续数组1.8 矩阵区域和 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f6…

提升晶振电路抗扰性:优化方案解析

在现代电子设备中&#xff0c;晶振作为提供稳定时钟信号的核心组件&#xff0c;其稳定性对整个系统的运行至关重要。然而&#xff0c;电路抗扰性不良往往会导致晶振失效&#xff0c;进而影响设备的整体性能。晶发电子针对这一问题&#xff0c;提出了以下关于晶振电路抗扰性及优…

【C++】拆分详解 - string类

文章目录 一、为什么学习string类&#xff1f;二、标准库中的string类  1. 定义  2. 常用接口说明     2.1 构造     2.2 容量操作     2.3 访问及遍历操作     2.4 修改操作     2.5 非成员函数 三、OJ练习自测  [1. 仅仅反转字母](https://leetcod…

9.23 My_string.cpp

my_string.h #ifndef MY_STRING_H #define MY_STRING_H#include <iostream> #include <cstring>using namespace std;class My_string { private:char *ptr; //指向字符数组的指针int size; //字符串的最大容量int len; //字符串当前…

华为三折叠一拆,苹果脸被打肿了!

文&#xff5c;琥珀食酒社 作者 | 随风 哎呀 苹果这次脸真是被华为狠狠打肿了 那些高高兴兴买iPhone 16的 东西一收到&#xff0c;脸马上就绿了啊 各种意想不到的问题啊 拆开手机后发现有两处掉漆咱就不说了 第一次滑动iPhone 16 Pro屏幕有响应 再滑动就没有响应了咱也…

【27】C++项目练习

练习1 题目如下 代码如下 .h #pragma once #include <string> using namespace std;class Toy { public:Toy();Toy(string name,int price,string place);~Toy();string getName() const;int getPrice() const;string getPlace() const;void changePrice(float count)…

自己开发的windows服务在虚拟机上不能正常启用

最近开发了个数据采集系统&#xff0c;在我本机上发布、安装是没有问题的&#xff1b;但是在虚拟机上进行安装部署的时候&#xff0c;反馈的错误码是1053&#xff0c;服务不能正常启动。 网上搜索可能的原因&#xff0c;如图&#xff1a; 能引起1053的问题比较多&#xff0c;首…

springboot实战学习笔记(4)(Spring Validation参数校验框架、全局异常处理器)

接着上篇博客学习。上篇博客是已经基本完成用户模块的注册接口的开发。springboot实战学习笔记&#xff08;3&#xff09;(Lombok插件、postman测试工具、MD5加密算法、post请求、接口文档、注解、如何在IDEA中设置层级显示包结构、显示接口中的方法)-CSDN博客本篇博客主要是关…

最新版Visual Studio安装教程(超详细,新手必看)

一、官网下载 这里奉上Visual Studio官方下载地址&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/https://visualstudio.microsoft.com/zh-hans/downloads/ 对于我们学习来说&#xff0c;下载第一个社区免费版即可&#xff0c;点击下载。 下载完成以后是…