算法通关村第十关青铜挑战——什么是快速排序

大家好,我是怒码少年小码。

快速排序

  1. 选取pivot中心轴
  2. 将大于pivot中心轴的元素放在中心轴的右边
  3. 将小于pivot中心轴的元素放在中心轴的左边
  4. 重复上述过程

实现方式一:

cpp 复制代码
void  quickSort(int arr[], int left, int right) {
	if (left < right) {
		int pivot = arr[right];
		int i = left - 1;
		for (int j = left; j < right; j++) {
			if (arr[j] < pivot) {
				i++;
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
		//哨兵移动到位置pivotIndex上
		int pivotIndex = i + 1 ;
		int temp = arr[pivotIndex];
		arr[pivotIndex] = arr[right];
		arr[right] = temp;

		quickSort(arr, left, pivotIndex - 1);
		quickSort(arr, pivotIndex + 1, right);
	}
	//输出查看
	for (int i = 0; i < right + 1; i++) {
		cout << arr[i] << ",";
	}
	cout << endl;
}

看到这么多的代码是不是怕了呀,不怕,我们一起看。

这段代码中我们把pivot保存数组中最右边的元素为基准。定义一个变量i保存需要交换元素的前一个元素。定义一个变量j从左至右遍历数组判断是否需要交换。最后再用递归实现一直重复的过程。

实现方式二:

下面这种方式就更好理解了取中间结点为pivot,left和right用于遍历和比较,当满足left <= right 并且要找到不符合条件的元素后就停下来,执行交换。可以输出打印检查看看对不对。最后再递归地重复这个过程。

cpp 复制代码
void quickSort01(int arr[], int start, int end) {
	if (start >= end) {
		return;
	}
	int left = start, right = end;
	int pivot = arr[(start + end) / 2];

	while (left <= right) {
		while (left <= right && arr[left] < pivot) {
			left++;
		}
		while (left <= right && arr[right] > pivot) {
			right--;
		}
		if (left <= right) {
			int temp = arr[left];
			arr[left] = arr[right];
			arr[right] = temp;
			left++;
			right--;
		}
	}
	for (int i = 0; i < right + 1; i++) {
		cout << arr[i] << ",";
	}
	cout << endl;
	quickSort(arr, start, right);
	quickSort(arr, left, end);
}
相关推荐
地平线开发者5 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮5 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者6 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考6 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx9 小时前
CART决策树基本原理
算法·机器学习
Wect10 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱10 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
肆忆_13 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星17 小时前
虚函数表:C++ 多态背后的那个男人
c++
Gorway17 小时前
解析残差网络 (ResNet)
算法