快速排序(看完就会)

目录

什么是快速排序

快速排序的步骤:

以上:

图片步骤简绘:

代码实现:


什么是快速排序

                快速排序是由C.A.R.Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,依次达到整个数据变成有序序列

快速排序的步骤:

                先给大家介绍一下算法中要用到的几个重要的标志

                        1、游标:f  b

                        2、标杆:t

                        3、L,R 区间范围

假设有一组数据,我们将第一个元素视为标杆,假设标杆是8,那么我们就可以开始第一次排序了

第一次排序最终是要实现8左边都是比8小的,8右边都是比8大的

f下标的元素如果比8小,游标就向右边进行移动,每次移动一个元素,直至f下标的元素比8大。则游标f停止移动

b下标的元素如果比8大,游标就向左边进行移动,每次移动一个元素,直至b下标的元素比8小,则游标b停止移动

当游标f,b都停止移动时,交换对应的元素

交换完成后继续重复以上的蓝色字体步骤

当游标f,b相遇并且交错的时候,交换标杆和游标b对应的元素、

以上:

        第一次排序结束,也就是说实现了8左边都是比8小的,8右边都是比8大的这一目标

此刻8左右两边各分成了左右区间,在对左右区间重复以上的排序步骤,也就是所谓的递归

直至区间中只有一个元素(区间中只有一个元素时,我们视为已序),则快速排序全部完成

图片步骤简绘:

代码实现:

#include <iostream>
#include <string>
using namespace std;
void _quick_sort(int arr[], int low, int hight);//核心递归函数
void quick_sort(int arr[], int size)
{
	_quick_sort(arr, 0, size - 1);//入口函数封装
}
void _quick_sort(int arr[], int low, int hight)
{
	//1、确定标杆 游标
	int t = arr[low];//标杆就是t,我们拿的第一个元素当成标杆
	int f = low + 1;//游标分别是f和b,f是左游标,b是右游标
	int b = hight;

	//2、设置递归结束条件
	if (low >= hight)//区间中最多只有一个元素-视为有序,也就是排序完成
		return;
		
	//3、开始划分大小区间
	int temp;//用于换成交换的变量
	while (f <= b)//f>b 说明区间搜索完成了
	{
		//3.1 移动游标
		while (f <= b&&arr[f] <= t) f++;//一直找到比标杆大的元素为止
		while (f <= b&&arr[b] >= t) b--;//一直找到比标杆小的元素为止
		//3.2 两个游标停了-交换
		if (f < b)
		{
			temp = arr[f];
			arr[f] = arr[b];
			arr[b] = temp;
			f++;
			b--;
		}
		//f>b 出循环 完成了分区
		//4、标杆归位 t和b进行交换
		//int t = arr[low];
		arr[low] = arr[b];
		arr[b] = t;

		//5、递归 标杆的位置在b
		_quick_sort(arr, low, b - 1);//递归左区间
		_quick_sort(arr, b + 1, hight);//递归右区间
	}
	
}
int main()
{
	int arr[]{8, 6, 1, 4, 5, 7, 2, 3};
	quick_sort(arr, 8);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_65334415/article/details/128224521