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

算法思想

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

代码实现

partition部分

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

你可能感兴趣的:(数据结构与算法,快速排序,数据结构,排序算法,算法)