快速排序(sort)

本文详细介绍了快速排序算法的核心思想——分治法,包括确定分界点、划分数组和递归处理等步骤。通过实例展示了如何以中间值为基准进行数组划分,并提供了C++代码实现,实现了快速排序算法的功能。

核心思想为分治

主体步骤:

        1:确定分界点

        2:以分界点为准将数组划分为高低两组(调整区间)

        3:递归执行以上两步

2.gif

                                                                                        (来源:AcWing 785. 快速排序 - AcWing

 1:确定分界点a[n]

        分界点取法多样,通常取  a[ l ] , a[ r ] , a[(l+r)/2] , a[随机],取得a[n]作为分治的分界点。

2:划分两组(调整区间)

        分别扫描a[n]两端数组,以a[n]为分界点,使得左区间<=a[n],右区间>=a[n](左端数组有大于a[n]的就放到右端,右端相反)。

3:递归

        分别递归处理两区间(左端右端再次分治)。

代码实现

#include<iostream>
#include<cstdio>

using namespace std;

int a[100010];

void qsort(int l,int r)
{
	if(l>=r)
	return;
	int i=l-1,j=r+1,x=a[(l+r)/2];	//确定分界点a[x](这里取中间值) 
	while(i<j)									
	{								//扫描左右两段 
		while(a[++i]<x);			//(这里用双指针 i j 优化) 
		while(a[--j]>x);
		if(i<j)
		swap(a[i],a[j]);
	}
	qsort(l,j);						//向下递归左段			
	qsort(j+1,r);					//递归右段 
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	qsort(1,n);
	for(int i=1;i<=n;i++)	printf("%d ",a[i]);
}

 

### 快速排序(QuickSort算法中 `sort` 函数的使用 在不同编程语言中实现快速排序时,通常不会直接调用名为 `sort` 的函数来执行快速排序;相反,会定义一个专门用于快速排序的方法或函数。然而,在某些情况下,可以利用内置的 `sort` 方法并自定义比较器来模拟快速排序的行为。 对于 Python 中基于列表的操作,虽然标准库提供了 `.sort()` 和 `sorted()` 这样的通用排序接口[^2],但为了展示快速排序的具体机制,下面给出了一种不依赖于这些内建功能的手动实现方式: ```python def quick_sort(arr): if len(arr) <= 1: return arr else: pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) # 使用示例 unsorted_list = [3, 6, 8, 10, 1, 2, 1] print("原始数组:", unsorted_list) sorted_list = quick_sort(unsorted_list) print("已排序数组:", sorted_list) ``` 这段代码展示了如何通过递归来分割输入序列直到每个子集只含有单个元素,之后再逐步合并它们形成最终有序的结果。值得注意的是,这里并没有直接使用任何叫做 `sort` 或者 `sortWith` 的现成函数[^1]。 #### 关键解释 - **基准选择**:选择了中间位置作为基准值 (`pivot`) 来划分数据集合。 - **分区过程**:创建三个新的列表分别存储小于、等于以及大于基准值的所有项。 - **递归处理**:对左侧和右侧两个较小规模的数据集重复上述步骤直至完成整个排序流程。 尽管如此,在实际应用中如果确实需要高效地对大量数据进行排序,则应该优先考虑使用经过高度优化的标准库提供的排序方法,因为那些往往已经针对性能做了很多改进工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值