快速排序(以中间为基准)

本文介绍了一种经典的排序算法——快速排序。通过分治法将数组分成两个子数组,并递归地进行排序。文章详细解释了快速排序的具体实现过程,包括基准元素的选择、分区操作以及递归调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* 快速排序。
* @param inputs
*/
public static void quickSort(int[] inputs,
Comparator<Integer> cp) {
sort(inputs, 0, inputs.length - 1, cp);
}

/**
* 快速排序算法,结果是从小到大。
* @param inputs       待排序对象数组。
* @param low          首
* @param high         尾
*/
private static void sort(int[] inputs, int low, int high,
Comparator<Integer> cp) {
int index0 = low;
int index1 = high;
int mid;
if (high > low) {
mid = inputs[(low + high) / 2];
while (index0 <= index1) {
while ((index0 < high) && (cp.compare(inputs[index0], mid) == -1)) {
++index0;
}
while ((index1 > low) && (cp.compare(inputs[index1], mid) == 1)) {
--index1;
}
if (index0 <= index1) {
swap(inputs, index0, index1);
++index0;
--index1;
}
}
if (low < index1) {
sort(inputs, low, index1, cp);
}
if (index0 < high) {
sort(inputs, index0, high, cp);
}
}
}

/**
* 交换。
* @param objs
* @param i
* @param j
*/
private static void swap(int[] objs, int i, int j) {
int T;
T = objs[i];
objs[i] = objs[j];
objs[j] = T;

}


分治和递归,以中间为准基数,分割数组为两部分,如果左边的index0指向数据小于准基数,则满足条件(左边的小于准基数),下标增加一(index0++),用下一个数据和准基数对比,如果满足,再看一下个数据。如果右边的数据大于准基数,则满足条件(右边的数据大于准基数),下边减一(index1--),用上一个数据和准基数进行对比。。。

### 快速排序算法使用中间值作为基准的演示过程 快速排序是一种基于分治法(Divide and Conquer)思想的经典排序算法,其核心在于通过选取一个基准值(pivot),将待排序数组划分为两个子数组[^1]。具体到选择中间值作为基准的情况,以下是详细的演示过程: #### 基本原理 在快速排序中,如果选择中间值作为基准,则意味着每次分割操作时,从当前区间中的中间位置取出该元素作为基准值[^3]。这一方法可以减少因极端情况(如已排序数组)而导致的时间复杂度退化至 \(O(n^2)\)[^2]。 #### 演示步骤描述 假设有一个无序数组 `arr`,长度为 `n`,下面是一个具体的例子及其对应的动态变化过程: 初始数组: \[ \text{arr} = [8, 3, 7, 9, 5, 1, 6] \] 1. **选定基准值** 计算数组的中间索引并取对应值作为基准值。对于上述数组,中间索引为 \(\lfloor (0 + 6)/2 \rfloor = 3\),因此基准值为 `arr[3] = 9`[^3]。 2. **分区操作** 将小于基准值的元素移到左侧,大于等于基准值的元素移到右侧。经过此步处理后得到新数组: \[ [\_,\_,\_,\_,\_,\_], 9 ] \quad (\text{其中空白部分表示尚未完成调整}) \] 调整后的实际状态可能如下所示: \[ [8, 3, 7, 5, 1, 6], 9 ] \] 3. **递归调用** 对于左半部分 `[8, 3, 7, 5, 1, 6]` 和右半部分为空的部分分别再次执行相同的操作。继续以中间值为基准进行划分直至无法再细分为止。 最终结果将是完全有序的数组: \[ [1, 3, 5, 6, 7, 8, 9] \] #### 动态展示代码实现 下面是采用 Python 编写的快速排序函数,其中选择了中间值作为基准值: ```python def quick_sort_middle_pivot(arr): if len(arr) <= 1: return arr else: mid_index = len(arr) // 2 pivot = arr[mid_index] # 移除基准值以便后续比较 arr.remove(pivot) left = [] right = [] for num in arr: if num < pivot: left.append(num) else: right.append(num) return quick_sort_middle_pivot(left) + [pivot] + quick_sort_middle_pivot(right) # 测试用例 test_array = [8, 3, 7, 9, 5, 1, 6] sorted_array = quick_sort_middle_pivot(test_array.copy()) print(sorted_array) ``` 以上代码实现了完整的快速排序逻辑,并始终选用中间值作为基准值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值