Java快速排序算法、三路快排(Java算法和数据结构总结笔记)[7/20]

一、什么是快速排序算法

        快速排序的基本思想是选择一个基准元素(通常选择最后一个元素)将数组分割为两部分,一部分小于基准元素,一部分大于基准元素。

        然后递归地对两部分进行排序,直到整个数组有序。这个过程通过 partition 方法实现,它使用两个指针 i 和 j 来遍历数组,将小于基准元素的元素交换到左边,大于基准元素的元素交换到右边。

        最后,将基准元素放入正确的位置,并返回该位置作为划分点。快速排序的时间复杂度为O(nlogn)。

如下:快速排序算法的实现代码:

import java.util.Arrays;/*** @Description 快速排序算法**/
public class QuickSort {public static void main(String[] args) {int[] array = {0, 8, 9, 5, 6, 1, 4, 9, 3, 6, 3, 8, 2, 1, 7};quickSort(array, 0, array.length - 1);System.out.println("Sorted array: " + Arrays.toString(array));}// 递归函数用于执行快速排序public static void quickSort(int[] array, int low, int high) {if (low < high) {// 分割数组并获取基准元素的索引int pivotIndex = partition(array, low, high);// 递归排序左侧和右侧子数组quickSort(array, low, pivotIndex - 1);quickSort(array, pivotIndex + 1, high);}}// 函数用于分割数组并返回基准元素的索引public static int partition(int[] array, int low, int high) {// 选择基准元素(在本例中选择最后一个元素)int pivot = array[high];int i = low - 1;// 遍历数组for (int j = low; j < high; j++) {if (array[j] < pivot) {// 如果元素小于基准元素,则交换位置i++;swap(array, i, j);}}// 将基准元素放入正确的位置swap(array, i + 1, high);// 返回基准元素的索引return i + 1;}// 函数用于交换数组中的两个元素public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

排序输出:

上述代码中,就是快速排序算法的一种实现,总结来说就是:

1. 选择一个基准元素(通常是数组中的最后一个元素)。 
2. 将数组分割为两部分,一部分是小于基准元素的元素,另一部分是大于基准元素的元素。 
3. 对这两部分分别递归地应用快速排序算法,直到每个子数组都有序。 
4. 将所有子数组合并起来,得到最终排序后的数组。 
 
具体步骤实现: 
 
1. 选择基准元素。 
2. 设置两个指针,一个指向数组的起始位置(通常为low),另一个指向数组的结束位置(通常为high)。 
3. 从起始位置开始,向右移动指针,直到找到一个大于或等于基准元素的元素。 
4. 从结束位置开始,向左移动指针,直到找到一个小于或等于基准元素的元素。 
5. 如果左指针的位置小于右指针的位置,则交换这两个元素。 
6. 重复步骤3到5,直到左指针的位置大于或等于右指针的位置。 
7. 将基准元素与左指针所指向的元素进行交换,将基准元素放置在正确的位置。 
8. 递归地对基准元素左侧和右侧的子数组应用快速排序算法。 
 
快速排序的关键在于划分过程,即将数组分割为两部分。通过不断地划分和排序,最终实现整个数组的排序。快速排序的平均时间复杂度为O(nlogn),是一种高效的排序算法。

二、快速排序算法和三路快排的关系

        快速排序算法和三路快速排序算法都是基于快速排序思想的排序算法,它们之间的关系是三路快速排序算法是对快速排序算法的一种改进和优化。 
 
        快速排序算法通过选择一个基准元素,将数组分割为两部分,一部分是小于基准元素的元素,另一部分是大于基准元素的元素。然后递归地对这两部分进行排序,直到整个数组有序。 
 
        而三路快速排序算法在快速排序的基础上进行了改进。它通过选择两个基准元素,将数组划分为三部分:小于第一个基准元素、等于第一个基准元素、大于第一个基准元素的元素。然后递归地对小于和大于基准元素的两部分进行排序,而不需要再对等于基准元素的部分进行排序,因为它们已经在正确的位置上。 
 
三路快速排序算法在处理包含大量重复元素的数组时表现更好,因为它能够更有效地处理重复元素,减少了不必要的比较和交换操作。相比于快速排序算法,三路快速排序算法的时间复杂度仍然是O(nlogn),但在某些情况下,它的性能更好。 
 
总的来说,三路快速排序算法是对快速排序算法的改进,通过减少重复元素的比较和交换操作,提高了排序的效率。

三、三路快排代码实现

/*** @Description 三路快排**/
public class ThreeWayQuickSort {public static void main(String[] args) {int[] array = {9, 8, 5, 9, 2, 9, 1, 2, 3, 4, 6, 8, 4, 7};quickSort(array, 0, array.length - 1);System.out.println("排序后的数组:");for (int num : array) {System.out.print(num + " ");}}// 三路快速排序算法public static void quickSort(int[] array, int low, int high) {if (low < high) {// 将数组划分为三部分,并返回等于pivot值的范围int[] range = partition(array, low, high);// 递归地对小于pivot和大于pivot的部分进行排序quickSort(array, low, range[0] - 1);quickSort(array, range[1] + 1, high);}}// 划分数组为三部分的函数public static int[] partition(int[] array, int low, int high) {int pivot = array[low]; // 选择第一个元素作为pivotint lt = low; // 初始化lt指针指向lowint gt = high; // 初始化gt指针指向highint i = low + 1; // 初始化i指针指向low的下一个位置while (i <= gt) {if (array[i] < pivot) {swap(array, i, lt);i++;lt++;} else if (array[i] > pivot) {swap(array, i, gt);gt--;} else {i++;}}// 返回等于pivot值的范围int[] range = {lt, gt};return range;}// 交换数组中两个元素的函数public static void swap(int[] array, int i, int j) {int temp = array[i];array[i] = array[j];array[j] = temp;}
}

排序输出:

三路快速排序算法是一种高效的排序算法,它通过将数组划分为三个部分来进行排序:

小于pivot的部分、等于pivot的部分和大于pivot的部分。

下面是三路快速排序算法的实现思路步骤总结: 
 
1. 选择一个pivot元素(通常选择数组的第一个元素)。 
2. 初始化三个指针:lt指向数组的起始位置,gt指向数组的结束位置,i指向数组的起始位置的下一个位置。 
3. 从i开始遍历数组,比较当前元素与pivot的大小关系: 
   - 如果当前元素小于pivot,将它与lt指针指向的元素交换,并将lt和i指针都向右移动一位。 
   - 如果当前元素大于pivot,将它与gt指针指向的元素交换,并将gt指针向左移动一位。 
   - 如果当前元素等于pivot,将i指针向右移动一位。 
4. 重复步骤3,直到i指针遍历完整个数组。 
5. 最终,数组将被划分为三个部分:小于pivot的部分、等于pivot的部分和大于pivot的部分。 
6. 递归地对小于pivot和大于pivot的部分进行三路快速排序。 
 
三路快排算法通过将相等的元素放在中间,这样就避免了重复比较和交换的过程,从而提高了排序的效率。

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

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

相关文章

[java进阶]——方法引用改写Lambda表达式

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 &#x1f4d5;概念介绍&#xff1a; ⭐方法引用的前提条件&#xff1a; 1.引用静态方法 2.引用构造方法 ①类的构造&#xff1a; ②数组的构造&#xff1a; 3.引用本类或父类的成员方法 ①本类&#xff1…

Databend 开源周报第 118 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 MERGE INTO 现已…

电脑发热发烫,具体硬件温度达到多少度才算异常?

环境&#xff1a; 联想E14 问题描述&#xff1a; 电脑发热发烫,具体硬件温度达到多少度才算异常? 解决方案&#xff1a; 电脑硬件的温度正常范围会因设备类型和使用的具体硬件而有所不同。一般来说&#xff0c;以下是各种硬件的正常温度范围&#xff1a; CPU&#xff1a;正…

安装node-sass安装失败(Failed at the node-sass@4.14.1 postinstall script.)

npm i安装依赖&#xff0c;安装node-sass失败 全局设置淘宝镜像&#xff0c;还是下载不下来。下载不下来可能是因为默认从github上去下载node-sass&#xff0c;而国内经常连不上或者网络不好。可以单独下载 npm i node-sass4.14.1 --sass_binary_sitehttps://npm.taobao.org/…

TensorFlow学习笔记--(1)张量的随机生成

张量的生成 如何判断一个张量的维数&#xff1a;看张量的中括号有几层 0 1 2 &#xff1a;零维数列 [2 4 6] : 一维向量 [ [1 2 3] [4 5 6] ] : 二维数组 两行三列 第一行数据为 1 2 3 第二行数据为 4 5 6 以此类推 n维张量有n层中括号 tf.zeros(%指定一个张量的维数%) 生成一…

易点易动设备管理系统:提升设备巡检和维修效率,延长设备使用寿命的利器

在现代企业中&#xff0c;设备管理是一个至关重要的环节。然而&#xff0c;许多企业在设备巡检和维修方面面临挑战&#xff0c;如效率低下、信息不透明等问题。为了帮助企业提升设备巡检和维修效率&#xff0c;并延长设备的使用寿命&#xff0c;易点易动设备管理系统应运而生。…

卷积神经网络中 6 种经典卷积操作

深度学习的模型大致可以分为两类&#xff0c;一类是卷积神经网络&#xff0c;另外一类循环神经网络&#xff0c;在计算机视觉领域应用最多的就是卷积神经网络&#xff08;CNN&#xff09;。CNN在图像分类、对象检测、语义分割等经典的视觉任务中表现出色&#xff0c;因此也早就…

腾讯云16核服务器配置有哪些?CPU型号处理器主频性能

腾讯云16核服务器配置大全&#xff0c;CVM云服务器可选择标准型S6、标准型SA3、计算型C6或标准型S5等&#xff0c;目前标准型S5云服务器有优惠活动&#xff0c;性价比高&#xff0c;计算型C6云服务器16核性能更高&#xff0c;轻量16核32G28M带宽优惠价3468元15个月&#xff0c;…

干洗店洗鞋店管理系统app小程序;

干洗店洗鞋店管理系统是一款专业的洗衣店管理软件&#xff0c;集成了前台收费收银系统、会员卡管理系统和财务报表系统等强大功能。界面简洁优美&#xff0c;操作直观简单。这款系统为干洗店和洗衣店提供了成本分析、利润分析、洗衣流程管理等诸多实用功能&#xff0c;用全新的…

OPCUA 行业配套标准:机器人

OPC UA 定义了对象&#xff0c;对象类型&#xff0c;结构化组织能力和定义对象之间关系的能力&#xff0c;利用这些基础和衍生类型及对象&#xff0c;用户还可以搭建出更复杂的类型&#xff0c;关系和对象。 如果不同的厂商或者用户定义的信息模型不同&#xff0c;将会影响系统…

【Vue】组件封装小技巧 — 利用$attrs和v-bind接收传递未定义的属性

使用介绍 在Vue.js中&#xff0c;$attrs 和v-bind可以用于组件的二次封装&#xff0c;以在封装的组件中传递父组件的属性和事件。这对于创建高度可定制的通用组件非常有用。 下面是一些示例代码&#xff1a; 假设你有一个名为MyButton的自定义按钮组件&#xff0c;它接受一些…

CCF ChinaSoft 2023 论坛巡礼 | NASAC青年软件创新奖论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…