一、伪代码
快速排序,也是分治法。
1.PATITION
意义:就是通过pivot将数组分成两部分,前面的一部分小于等于pivot,后面的一部分大于pivot。
将倒数第一作为 轴 pivot
建立两个哨i(开始再往前一个)(i+1表示大于pivot的元素)、j(遍历的、从开始到倒数第二)(表示当前小于等于pivot的元素)
遍历j:如果元素A[j]小于等于轴A[r],将i加一,并且交换A[i]和A[j](或者说交换A[++i]和A[j])。作用就是将小于等于pivot的和大于pivot的交换。
最后交换A[i+1]和A[r],即将pivot交换到前部分中。
返回i+1,即pivot的下标
PS:妙,交换次数更少
2.quickSort
先校验
PARTITION返回个下标q(pivot的下标,之前的是小于等于它的,之后的是大于它的)
用q来分,QUICKSORT(A,p,q-1)
QUICKSORT(A,q+1,r)
PS:妙啊,q都不动
二、C++实现
#include <iostream>
using namespace std;
// 数组A部分,下标[p,r]
int PARTITION(int A[], int p, int r)
{
// 将倒数第一作为 轴 pivot
int pivot = A[r];
// 哨i,开始再往前一个:i+1表示大于pivot的元素
int i = p - 1;
// 哨j,从开始到倒数第二:表示当前小于等于pivot的元素
for (int j = p; j <= r - 1; j++)
{
// 元素A[j]小于等于轴A[r]
if (A[j] <= pivot)
{
// 将大于pivot的和小于等于pivot的交换。
swap(A[++i], A[j]);
}
}
// 将pivot交换到前部分中
swap(A[i + 1], A[r]);
// pivot的下标
return i + 1;
}
// 排序数组A,下标[p,r]
void quickSort(int A[], int p, int r)
{
// 校验
if (p < r)
{
// pivot的下标,之前的是小于等于它的,之后的是大于它的
int q = PARTITION(A, p, r);
// q都不动
quickSort(A, p, q - 1);
quickSort(A, q + 1, r);
}
}
int main()
{
int A[] = {8, 4, 5, 7, 1, 3, 6, 2};
int length = sizeof(A) / sizeof(int);
quickSort(A, 0, length - 1);
for (int i = 0; i < length; i++)
{
cout << A[i] << ' ';
}
return 0;
}