只要第三个问
时间: 2025-08-16 21:58:00 浏览: 1
<think>我们只需要第三个问题:使用java实现快排
因此,我们直接给出Java实现的快速排序代码,并解释。然后按照要求提出相关问题。
注意:回答格式要求,先回答问题(给出代码和解释),然后提出相关问题。</think>以下是用Java实现的快速排序代码:
```java
public class QuickSort {
public static void main(String[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
quickSort(arr, 0, arr.length - 1);
System.out.println("Sorted array: ");
for (int num : arr) {
System.out.print(num + " ");
}
}
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// 获取分区点索引
int pi = partition(arr, low, high);
// 递归排序左半部分
quickSort(arr, low, pi - 1);
// 递归排序右半部分
quickSort(arr, pi + 1, high);
}
}
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++;
// 交换 arr[i] 和 arr[j]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 将基准元素放到正确位置
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1; // 返回基准索引
}
}
```
### 代码解释:
1. **核心方法**:
- `quickSort()`:递归进行排序,先通过`partition()`确定基准位置,再对左右子数组递归排序
- `partition()`:选择最后一个元素为基准,将小于基准的元素移到左侧,大于基准的元素移到右侧
2. **分区过程**:
- 初始化边界索引 `i = low - 1`
- 遍历数组元素(`j`从`low`到`high-1`):
- 当前元素小于基准时,`i`增加并交换`arr[i]`和`arr[j]`
- 最后将基准元素`arr[high]`与`arr[i+1]`交换
3. **时间复杂度**:
- 平均情况:O(n log n)
- 最坏情况(已排序数组):O(n²)
- 空间复杂度:O(log n)(递归栈)
4. **优化点**:
- 基准选择:可改用随机选择或三数取中法避免最坏情况
- 小数组切换:当子数组较小时可改用插入排序
执行示例:
```
输入: [10, 7, 8, 9, 1, 5]
输出: [1, 5, 7, 8, 9, 10]
```
阅读全文