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

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

快速排序

  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);
}
相关推荐
灵感__idea5 小时前
Hello 算法:贪心的世界
前端·javascript·算法
澈2076 小时前
深入浅出C++滑动窗口算法:原理、实现与实战应用详解
数据结构·c++·算法
A.A呐6 小时前
【C++第二十九章】IO流
开发语言·c++
ambition202427 小时前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_7 小时前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi7 小时前
前缀和差分
算法·图论
代码旅人ing7 小时前
链表算法刷题指南
数据结构·算法·链表
kebeiovo7 小时前
atomic原子操作实现无锁队列
服务器·c++
Yungoal7 小时前
常见 时间复杂度计算
c++·算法
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵