快速排序
算法目的:
一种将无序数组的某个区间范围内的元素排列成有序的。
算法思想:
通过递归与分治思想完成算法
分治:将待排序数组区间不断缩小
递归:对缩小的区间再进行递归排序
算法主要分两部分:
1、先将数组相对数组某一个元素分为两部分(前大后小 --由排序递增递减而定 )
先将对比值取出
设定左右索引 分别从左遍历、从右遍历 (结束条件 : 左索引不小于右索引 )
当其值不满足规定时 交换两值
将对比值放入左右索引的位置
2、将这左右两部分数组,进行递归操作 (递归终止条件为左索引初值不小于右索引初值)
动态演示:
算法代码:
时间 O( n*log n) 空间(1)
#include<iostream>
#include<vector>
using namespace std;
void Quick_sort(vector<int>& A, int l, int r)
{
//基线条件
if (l < r)
{
//左右动态索引
int lindex = l;
int rindex = r;
//判断值
int k = A[r];
while (lindex < rindex)
{
//更新左索引,从左往右找出小于判定值的元素索引
while (lindex < rindex && A[lindex] >= k)
lindex++;
//将其覆盖, 首次覆盖时,覆盖掉的是判定值,之后覆盖的是右索引对应值的副本
if (lindex < rindex)
A[rindex--] = A[lindex];
//更新右索引,从左往右找出小于判定值的元素索引
while (rindex > lindex && A[rindex] <= k)
rindex--;
//将其覆盖,覆盖的是左索引对应值的副本
if (lindex < rindex)
A[lindex++] = A[rindex];
}
//结束后 左右索引相等 ,且其值是副本,已经存在在之前索引元素中
//将最开始被覆盖掉的判定值覆盖在此处
A[rindex] = k;
//数组被分为两部分
//将这两部分,分别再次进行快排(即递归)
Quick_sort(A, l, lindex - 1);
Quick_sort(A, rindex + 1, r);
}
}
int main()
{
vector<int> A = { 1,2,3,5,8,9,6,2,3,1,4,7,8,5 };
//排序数组中索引 0--9的元素
Quick_sort(A, 0, 9);
for (auto a : A)
cout << a << " ";
return 0;
}
备注解释略多…….