java-快速排序 2

### 8. 快速排序的实际应用

快速排序由于其高效的性能,广泛应用于各种实际场景中,例如数据库中的索引排序、系统文件排序等。以下是一个综合示例,展示如何使用快速排序对学生成绩进行排序。

```java
public class Student {
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    public int getScore() {
        return score;
    }

    public String getName() {
        return name;
    }

    public static void quickSort(Student[] students, int low, int high) {
        if (low < high) {
            int pi = partition(students, low, high);
            quickSort(students, low, pi - 1);
            quickSort(students, pi + 1, high);
        }
    }

    private static int partition(Student[] students, int low, int high) {
        int pivot = students[high].getScore();
        int i = low - 1;
        for (int j = low; j < high; j++) {
            if (students[j].getScore() < pivot) {
                i++;
                swap(students, i, j);
            }
        }
        swap(students, i + 1, high);
        return i + 1;
    }

    private static void swap(Student[] students, int i, int j) {
        Student temp = students[i];
        students[i] = students[j];
        students[j] = temp;
    }

    public static void main(String[] args) {
        Student[] students = {
            new Student("Alice", 85),
            new Student("Bob", 92),
            new Student("Charlie", 88),
            new Student("David", 79),
     

```java
            new Student("Eve", 91)
        };

        quickSort(students, 0, students.length - 1);

        System.out.println("Sorted students by score:");
        for (Student student : students) {
            System.out.println(student.getName() + ": " + student.getScore());
        }
    }
}
```

在这个示例中,我们定义了一个`Student`类,并实现了一个基于学生成绩的快速排序方法`quickSort`。排序后,学生按成绩升序排列。

### 9. 快速排序的详细步骤和解释

为了更好地理解快速排序,下面详细解释每一步的实现和优化方法:

#### 9.1 选择基准

选择基准的方法可以影响快速排序的性能。常用的基准选择方法有:

1. **固定选择**:选择第一个元素或最后一个元素作为基准,简单但容易导致最坏情况。
2. **随机选择**:随机选择一个元素作为基准,可以避免最坏情况。
3. **三数取中法**:选择第一个元素、中间元素和最后一个元素的中位数作为基准,效果较好。

#### 9.2 划分数组

划分数组的方法是快速排序的核心步骤。它通过比较和交换元素,将数组分成两部分,使得基准左侧的元素都小于基准,右侧的元素都大于基准。

```java
private static int partition(int[] array, int low, int high) {
    int pivot = array[high]; // 选择最后一个元素作为基准
    int i = low - 1; // i指向小于基准的区域的最后一个元素

    for (int j = low; j < high; j++) {
        if (array[j] < pivot) {
            i++;
            swap(array, i, j);
        }
    }
    swap(array, i + 1, high);
    return i + 1;
}

private static void swap(int[] array, int i, int j) {
    int temp = array[i];
    array[i] = array[j];
    array[j] = temp;
}
```

#### 9.3 递归排序

划分完成后,快速排序递归地对左右两个子数组进行排序,直到整个数组有序。

```java
public static void quickSort(int[] array, int low, int high) {
    if (low < high) {
        int pi = partition(array, low, high);
        quickSort(array, low, pi - 1);
        quickSort(array, pi + 1, high);
    }
}
```

### 10. 快速排序的实际应用案例

快速排序广泛应用于各种需要高效排序的场景,如数据库的索引排序、系统文件排序等。以下是一个更复杂的应用示例,展示如何使用快速排序对商品进行排序。

```java
public class Product {
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public double getPrice() {
        return price;
    }

    public String getName() {
        return name;
    }

    public static void quickSort(Product[] products, int low, int high) {
        if (low < high) {
            int pi = partition(products, low, high);
            quickSort(products, low, pi - 1);
            quickSort(products, pi + 1, high);
        }
    }

    private static int partition(Product[] products, int low, int high) {
        double pivot = products[high].getPrice();
        int i = low - 1;
        for (int j = low; j < high; j++) {
            if (products[j].getPrice() < pivot) {
                i++;
                swap(products, i, j);
            }
        }
        swap(products, i + 1, high);
        return i + 1;
    }

    private static void swap(Product[] products, int i, int j) {
        Product temp = products[i];
        products[i] = products[j];
        products[j] = temp;
    }

    public static void main(String[] args) {
        Product[] products = {
            new Product("Laptop", 999.99),
            new Product("Smartphone", 599.99),
            new Product("Tablet", 299.99),
            new Product("Smartwatch", 199.99),
            new Product("Headphones", 99.99)
        };

        quickSort(products, 0, products.length - 1);

        System.out.println("Sorted products by price:");
        for (Product product : products) {
            System.out.println(product.getName() + ": $" + product.getPrice());
        }
    }
}
```

在这个示例中,我们定义了一个`Product`类,并实现了一个基于商品价格的快速排序方法`quickSort`。排序后,商品按价格升序排列。

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

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

相关文章

快手主播李香周助力推动 K-beauty风潮谈背后成功秘诀

近年来&#xff0c;互联网的迅速发展和SNS社交媒体的普及&#xff0c;人们通过网络可以随时随地对自己感兴趣的自由畅谈和学习。而直播带货更是作为一种依托于互联网兴起的新型营销方式&#xff0c;凭借其价格优势和新颖的介绍方式为消费者带来了十分便捷的购物体验。 本期采访…

多模态语言模型的新突破:Reka Core、Flash和Edge系列

人工智能领域的每一次技术革新都可能引领一场行业的变革&#xff0c;特别是在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;多模态语言模型&#xff08;MLMs&#xff09;正逐渐成为推动智能系统发展的核心力量。Reka团队最新推出的Reka Core、Flash和Edge系列模型&…

解决 Git 不区分大小写导致的文件冲突问题

有些同学在 Git 仓库对文件/文件夹进行命名时&#xff0c;刚开始是小写&#xff0c;后来为了保持团队一致&#xff0c;又改成了大写&#xff0c;然而 Git 不会发现大小写的变化&#xff0c;此时就出了问题&#xff1a;导致仓库里出现了 大小写 同时存在的两个文件。但在 Window…

一个项目学习Vue3---快速了解Vue代码结构

基础结构 Vue文件中基本上和咱们自己写Html、CSS、JS差不太多&#xff0c;主要也由这三部分组成 HTML部分&#xff1a; <template><div>这里面写HTML代码</div> </template> CSS部分&#xff1a; <style scoped> .aaa {font-size: 3em; } &…

蚂蚁- 定存

一&#xff1a;收益变动&&收益重算 1.1: 场景组合 1: 澳门元个人活期&#xff0c;日终余额大于0&#xff0c;当日首次、本周本月非首次系统结息&#xff0c;结息后FCDEPCORE_ASYN_CMD_JOB捞起进行收益计算 【depc_account_revenue_detail】收益日 > 【depc_accoun…

golang使用RSA加密和解密

目录 前提 生成RSA公钥和密钥 读取文件 加密 解密 前提 本文章我们是先读取的RSA文件&#xff0c;所以需要先生成RSA&#xff0c;并且保存在文件中&#xff0c;再进行加密 生成RSA公钥和密钥 如果没有公钥和密钥&#xff0c;可以先看看我上一篇文章 生成RSA公钥和密钥h…

umi3项目axios 请求参数序列化参数

由于get 请求中有一个日期参数 dates 是一个数组类型。 未处理参数时请求地址是这样的&#xff1a;/api/list?page1&pageSize10&keyWord&dates[]2024-06-10&dates[]2024-06-24 会发现dates后面有中括号,所以前端需要将参数格式处理变成如下&#xff1a;/api…

微软Edge浏览器搜索引擎切换全攻略

微软Edge浏览器作为Windows 10的默认浏览器&#xff0c;提供了丰富的功能和良好的用户体验。其中&#xff0c;搜索引擎的切换功能允许用户根据个人喜好和需求&#xff0c;快速更换搜索引擎&#xff0c;从而获得更加个性化的搜索服务。本文将详细介绍如何在Edge浏览器中进行搜索…

同步模式之保护性暂停模式

1. Guarded Suspension&#xff1a;一个线程需要等待另一个线程的执行结果 2. 理解 一个线程需要将结果传递给另一个线程&#xff0c;将这两个线程关联到到同一个 GuardedObject 如果需要源源不断地传递结果&#xff0c;需要使用消息队列&#xff08;生产者-消费者模型&…

Unity 从0开始编写一个技能编辑器_03_Buff系统的Handler

BuffHandler可以是用于处理角色身上buff的Mono类&#xff0c;任何具备跟Buff交互的角色&#xff0c;都要携带这个BuffHandler脚本。如果你的Buff有额外的处理机制&#xff0c;比如互斥Buff&#xff08;如&#xff1a;免疫负面效果的霸体&#xff09;&#xff0c;需要在AddBuff方…

最新AIGC系统源码-ChatGPT商业版系统源码,自定义ChatGPT指令Promp提示词,AI绘画系统,AI换脸、多模态识图理解文档分析

目录 一、前言 系统文档 二、系统演示 核心AI能力 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI模型提问 文档分析 ​识图理解能力 3.2 GPts应用 3.2.1 GPTs应用 3.2.2 GPTs工作台 3.2.3 自定义创建Promp指令预设应用 3.3 AI专业绘画 3.3.1 文…

【51单片机入门】数码管原理

文章目录 前言共阴极与共阳极数码管多个数码管显示原理 总结 前言 在我们的日常生活中&#xff0c;数码管被广泛应用于各种电子设备中&#xff0c;如电子表、计时器、电子钟等。数码管的主要功能是显示数字和一些特殊字符。在这篇文章中&#xff0c;我们将探讨数码管的工作原理…

SpringMVC启动流程

文章目录 引文HandlerHandlerMapperHandlerAdapterRequestMapping方法参数解析RequestMapping方法返回值解析文件上传流程拦截器解析 SpringMVC启动流程如下 引文 我们在使用SpringMVC时&#xff0c;传统的方式是在webapp目录下定义一个web.xml文件&#xff0c;比如&#xff1a…

PerplexityAI与《连线》杂志纠纷事件深度分析

引言 最近&#xff0c;PerplexityAI&#xff0c;这家人工智能搜索领域的新秀公司&#xff0c;因被《连线》杂志指控剽窃内容和捏造事实而陷入困境。这起事件引发了广泛关注&#xff0c;也揭示了AI技术在信息检索和内容生成领域面临的一系列挑战。本文将对该事件进行详细分析&a…

Android Lint

文章目录 Android Lint概述工作流程Lint 问题问题种类警告严重性检查规则 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具&#xff0c;它可以帮助我们发现代码结构/质量…

CONSTRAINT关键字

CREATE TABLE accounts(acctNo CHAR(20) PRIMARY KEY,balance FLOAT,CONSTRAINT c1 CHECK(balance > 0) ); 1、CONSTRAINT C1部分定义了一个新的约束&#xff0c;这里命名为C1 2、CHECK(BALANCE>0)是约束的具体内容&#xff0c;它规定了balance列的值必须大于等于0。这…

最小生成树拓展应用

文章目录 最小生成树拓展应用理论基础 题单1. [新的开始](https://www.acwing.com/problem/content/1148/)2. [北极通讯网络](https://www.acwing.com/problem/content/1147/)3. [走廊泼水节](https://www.acwing.com/problem/content/348/)4. [秘密的牛奶运输](https://www.ac…

用英文介绍芝加哥(1):Making Modern Chicago Part 1 Building a Boomtown

Making Modern Chicago | Part 1: Building a Boomtown Link: https://www.youtube.com/watch?vpNdX0Dm-J8Y&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index4 Summary Summary of Chicago’s History and Development Urban Planning and Growth Chicago, often r…

揭开油烟净化器行业的黑幕:材料以次充好,消费者权益何在?

我最近分析了餐饮市场的油烟净化器等产品报告&#xff0c;解决了餐饮业厨房油腻的难题&#xff0c;更加方便了在餐饮业和商业场所有需求的小伙伴们。 油烟净化器&#xff0c;作为现代厨房环保的必需品&#xff0c;原本应是保护家庭和环境的利器。然而&#xff0c;近年来市场上…

无需向量量化的自回归图像生成

摘要 https://arxiv.org/pdf/2406.11838 传统观点认为&#xff0c;用于图像生成的自回归模型通常伴随着向量量化的标记。我们观察到&#xff0c;尽管离散值空间可以方便地表示分类分布&#xff0c;但它对于自回归建模来说并不是必需的。在这项工作中&#xff0c;我们提出使用扩…