Java快速排序知识点(含面试大厂题和源码)

server/2024/10/21 7:49:12/

快速排序(Quick Sort)是一种高效的排序算法,采用分治法(Divide and Conquer)的策略来对一个数组进行排序。快速排序的平均时间复杂度为 O(n log n),在最坏的情况下为 O(n^2),但这种情况很少发生。快速排序因其高效性而在实际应用中非常受欢迎。

快速排序的工作原理:

  1. 选择基准值:从数组中选择一个元素作为基准值(pivot),选择方法有多种,如第一个元素、最后一个元素、中间元素或随机元素。
  2. 分区操作:重新排列数组,所有比基准值小的元素摆放在基准值的前面,所有比基准值大的元素摆放在基准值的后面(相等的可以到任一边)。在这个分区退出之后,基准值所在的位置就是其最终位置。
  3. 递归排序:递归地对基准值左侧和右侧的子数组进行快速排序。

快速排序的优缺点:

优点

  • 在平均情况下,快速排序具有很好的性能,时间复杂度为 O(n log n)。
  • 快速排序是原地排序,不需要额外的存储空间。

缺点

  • 最坏情况下的时间复杂度为 O(n^2),但可以通过随机化来避免。
  • 快速排序是不稳定的排序方法,相等的元素可能会在排序后相对位置发生变化。

快速排序的Java实现:

java">public class QuickSort {public 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);}}private int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return i + 1;}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {QuickSort solution = new QuickSort();int[] arr = {10, 7, 8, 9, 1, 5};solution.quickSort(arr, 0, arr.length - 1);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

面试中,快速排序是一个重要的知识点,它考察应聘者对分治法策略和递归思想的理解。通过实现快速排序,可以展示你对基本算法和数据结构的掌握程度。希望这些知识点和示例代码能够帮助你更好地准备面试!快速排序是一种流行且高效的排序算法,经常被用于面试中考察应聘者的算法实现能力。以下是三道可能出现在大厂面试中的与快速排序相关的编程题目,以及相应的Java源码实现。

题目 1:快速排序实现

描述
实现快速排序算法,对给定数组进行排序。

示例

输入: [3, 6, 8, 10, 1, 2, 1]
输出: 经过排序后的数组

Java 源码

java">import java.util.Arrays;public class QuickSortImplementation {public 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);}}private int partition(int[] arr, int low, int high) {int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return i + 1;}private void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}public static void main(String[] args) {QuickSortImplementation solution = new QuickSortImplementation();int[] arr = {3, 6, 8, 10, 1, 2, 1};solution.quickSort(arr, 0, arr.length - 1);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

题目 2:快速排序的变种 - 三数取中法的基准选择

描述
在快速排序中,基准值的选择对性能有很大影响。使用三数取中法选择基准值,即在数组中随机选择三个元素,然后取它们的中值作为基准值。

示例

输入: [3, 6, 8, 10, 1, 2, 1]
输出: 经过排序后的数组

Java 源码

java">import java.util.Random;public class QuickSortMedianOfThree {// 其他方法与上题相同,仅 partition 方法改变private int partition(int[] arr, int low, int high) {Random random = new Random();int pivotIndex = medianOfThree(arr, low, high);swap(arr, pivotIndex, high);int pivot = arr[high];int i = low - 1;for (int j = low; j < high; j++) {if (arr[j] < pivot) {i++;swap(arr, i, j);}}swap(arr, i + 1, high);return i + 1;}private int medianOfThree(int[] arr, int low, int high) {int mid = low + (high - low) / 2;if (arr[low] > arr[mid]) swap(arr, low, mid);if (arr[low] > arr[high]) swap(arr, low, high);if (arr[mid] > arr[high]) swap(arr, mid, high);swap(arr, mid, high);return high;}// swap 方法与上题相同// main 方法与上题相同
}

题目 3:快速排序优化 - 尾递归优化

描述
在快速排序中,对较小的子数组使用尾递归优化,以减少递归深度。

示例

输入: [3, 6, 8, 10, 1, 2, 1]
输出: 经过排序后的数组

Java 源码

java">public class QuickSortTailRecursion {// quickSort 方法与上题相同private int partition(int[] arr, int low, int high) {// ... 与上题相同}private void swap(int[] arr, int i, int j) {// ... 与上题相同}public static void main(String[] args) {QuickSortTailRecursion solution = new QuickSortTailRecursion();int[] arr = {3, 6, 8, 10, 1, 2, 1};solution.quickSort(arr, 0, arr.length - 1);System.out.println("Sorted array: " + Arrays.toString(arr));}// 添加 tailRecursiveQuickSort 方法进行尾递归优化public void tailRecursiveQuickSort(int[] arr, int low, int high) {while (low < high) {int pivotIndex = partition(arr, low, high);if (pivotIndex - low < high - pivotIndex) {tailRecursiveQuickSort(arr, low, pivotIndex - 1);low = pivotIndex + 1;} else {tailRecursiveQuickSort(arr, pivotIndex + 1, high);high = pivotIndex - 1;}}}
}

这些题目和源码展示了快速排序的不同应用和优化技巧。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试


http://www.ppmy.cn/server/6301.html

相关文章

【php快速上手(十一)】

目录 PHP快速上手&#xff08;十一&#xff09;PHP 连接数据库和创建数据库PHP 连接数据库使用 MySQLi连接 MySQL 数据库使用 PDO 连接 MySQL 数据库 PHP创建数据库使用MySQLi创建MySQL数据库&#xff1a;使用PDO创建MySQL数据库&#xff1a; PHP快速上手&#xff08;十一&…

【重生之我在学Android原生】Media3

前言 内容颇多&#xff0c;尽量从简 ExoPlayer使用 官方文档 参考文章 实现效果 Android&#xff08;java&#xff09; 使用ExoPlayer播放视频&#xff0c;自定义ExoPlayer界面&#xff0c;记录播放位置&#xff08;横屏竖屏切换/切换至后台等&#xff09; 案例实现 创建…

电脑工作者缓解眼部疲劳问题的工具分享

背景 作为以电脑为主要工作工具的人群&#xff0c;特别是开发人员&#xff0c;我们每天都需要长时间紧盯着屏幕&#xff0c;进行代码编写、程序调试、资料查询等工作。这种持续的工作模式无疑给我们的眼睛带来了不小的负担。一天下来&#xff0c;我们常常会感到眼睛干涩、疲劳…

浏览器工作原理与实践--HTTPS:让数据传输更安全

浏览器安全主要划分为三大块内容&#xff1a;页面安全、系统安全和网络安全。前面我们用四篇文章介绍了页面安全和系统安全&#xff0c;也聊了浏览器和Web开发者是如何应对各种类型的攻击&#xff0c;本文是我们专栏的最后一篇&#xff0c;我们就接着来聊聊网络安全协议HTTPS。…

Qt实现XYModem协议(四)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

网络安全(黑客技术)—2024自学

前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 如何成为一名黑客 很多朋友在学习安全方面都会半路转行&am…

matlab使用教程(46)—绘制条形图

1.条形图种类 如果需要查看一段时间内的结果、对比不同数据集的结果&#xff0c;或展示单个元素对汇总量的贡献和影响&#xff0c;则条形图会很有用处。 默认情况下&#xff0c;条形图会将一个向量或矩阵中的每个元素表现为一个条形&#xff0c;条形的高度与元素的值成比例。…

【MATLAB源码-第56期】基于WOA白鲸优化算法和PSO粒子群优化算法的三维路径规划对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1.粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟…