演示快速排序

本文详细介绍了快速排序算法的基本思路,通过选取基准值并将其余元素分为两组(一组大于基准值,另一组小于基准值),递归地对这两组进行排序,从而实现整个数组的排序。

思路:

每一轮找出一个基准值,把比它小的放左边,比它大的放右边,最终确认基准值的位置,以分治法,把原数组分为基准值的两边两个部分,继续上面的逻辑(这里随机选取10个数进行快速排序)

 

 

### 快速排序算法演示示例 快速排序是一种高效的排序算法,采用分治法策略。其基本过程是选择一个基准元素(pivot),将数组划分为两个子数组:一部分包含比基准小的元素,另一部分包含比基准大的元素。然后递归地对这两个子数组进行快速排序[^1]。 以下是一个完整的 Java 示例代码,用于演示快速排序的过程: ```java public class QuickSort { /** * 快速排序方法 * @param arr 待排序数组 * @param low 左边边界 * @param high 右边边界 */ 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); } } /** * 分区方法 * @param arr 待分区数组 * @param low 起始索引 * @param high 结束索引 * @return 基准元素的最终位置 */ private static 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; } /** * 交换数组中的两个元素 * @param arr 数组 * @param i 索引i * @param j 索引j */ private static 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) { int[] arr = {10, 7, 8, 9, 1, 5}; System.out.println("原始数组:"); for (int num : arr) { System.out.print(num + " "); } quickSort(arr, 0, arr.length - 1); System.out.println("\n排序后数组:"); for (int num : arr) { System.out.print(num + " "); } } } ``` #### 演示说明 - **初始数组**:`{10, 7, 8, 9, 1, 5}` - **排序步骤**: 1. 第一次划分以 `5` 为基准,将小于或等于 `5` 的数移到左边,大于 `5` 的数移到右边。 2. 递归地对左右子数组进行相同操作,直到所有子数组有序。 - **最终结果**:`{1, 5, 7, 8, 9, 10}` #### 时间复杂度与适用场景 - **平均时间复杂度**:O(n log n),适用于大规模乱序数据集。 - **最坏情况时间复杂度**:O(n²),当每次划分都极不均衡时出现。 - **空间复杂度**:O(log n),主要来自递归调用栈。 - **原地排序**:快速排序是一种原地排序算法,不需要额外存储空间。 - **稳定性**:不是稳定排序算法,相等元素的相对顺序可能改变。 该算法在动态数据集和对稳定性要求不高的情况下表现优异,尤其适合处理频繁变化的数据结构[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值