【C++、partition】快速排序算法实现

本文介绍了快速排序算法的思想和C++实现。该算法基于分治策略,通过选择基准值并将数组分为小于和大于基准值的两部分进行递归排序。文章详细阐述了partition过程,包括随机选取基准值,遍历数组并调整元素位置,最终实现数组的有序划分。
摘要由CSDN通过智能技术生成
算法思想

快速排序也采用分治思想;
把原始的数组筛选成较小和较大两个子数组,然后递归地排序两个子数组;
在分成较小和较大的两个子数组过程中,如何选定基准值很关键。

代码实现

partition部分

  • 随机选取基准值,放到数组末尾
  • 遍历数组(0-基准值前,不包括最后的基准值),逐个比较每个数与基准值的大小,只考虑两种情况:不比基准值大、比基准值大;
  • 借助i和j两个下标索引,j负责逐个遍历数组元素,i负责记录当前不大于基准值的尾后位置(有点绕,看代码),将不比基准值大的数按顺序交换到数组头,从数组头往数组尾生长;
  • 最后,把尾部基准值交换到i当前位置
#include<iostream>
#include<vector>
#include<random>
using namespace std;

void swap(vector<int>& nums, int m, int n);
int randRange(int low, int high);
int partition(vector<int>& nums, int low, int high);

//快速排序主体
void quicksort(vector<int>& nums, int low, int high) {
   
	if (low >= high) return;//如果只剩下一个元素,返回
	int p = partition(nums, low, high);//找到分割点,左半部分都不比它大,右半部分都比它大
	quicksort(nums, low, p - 1);//递归
	quicksort(nums, p + 1, high);
}

//使得被选出的基准值,都是当前子数组中的中间数
inline int partition(vector<int> &nums, int low, int high) {
   
	swap(nums, randRange(low, h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值