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

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

快速排序

  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);
}
相关推荐
Ada's8 小时前
【计算机基础系列】003:Python数据结构
开发语言·数据结构·python
Nil2089 小时前
leetcode 118杨辉三角
算法·leetcode·职场和发展
NeilYuen10 小时前
【C++】STL源码仿写(二):vector
开发语言·c++
郝学胜_神的一滴11 小时前
游戏引擎原理与实践 04:拆解引擎基础系统与内存管理
c++·游戏
wanderist.11 小时前
线性筛法详解:从筛质数到欧拉函数、Möbius 函数与约数函数
java·数据结构·算法
All for pursuit.11 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791311 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂12 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
倒头就睡的小比特12 小时前
C++多态
c++
光影少年12 小时前
为什么 JavaScript 中 0.1 + 0.2 !== 0.3,如何让其相等?
前端·javascript·算法