目录
什么是快速排序
快速排序是由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;
}