算法思想
先通过一个函数,标记第一个元素为基准元素,
然后分为左边都是大于基准元素的
右边都是小于基准元素的
然后使用排序函数分别对左半段和右半段进行排序
时间复杂度
最坏情况:$O(n^2)$
最好情况:$O(nlog_2n)$
平均情况:$O(nlog_2n)$
动态演示图
图片来源:https://blog.csdn.net/qq_40595682/article/details/102146917
C/C++代码实现
#include <cstdio>
#include <cstdlib>
void quictSort(int[], int, int);
int partition(int[], int, int);
int main()
{
int num[100];
int n;
while (~scanf("%d", &n) && n >= 0)
{
for (int i = 0; i < n; i++)
scanf("%d", &num[i]);
quictSort(num, 0, n - 1);
for (int i = 0; i < n; i++)
printf("%d ", num[i]);
printf("
");
}
return 0;
}
// 快速排序
void quictSort(int num[], int left, int right)
{
if (left < right)
{
int p = partition(num, left, right); // 分两段
quictSort(num, left, p - 1); // 左半段排序
quictSort(num, p + 1, right); // 右半段排序
}
}
// 从大到小排序
int partition(int num[], int left, int right)
{
int key = num[left]; // 第一个元素为基准元素
while (left < right)
{
while (left < right && num[right] <= key) // 从右往左找到比基准元素大的
right--;
if (left < right)
num[left] = num[right]; // 把大的交换到左边
while (left < right && num[left] >= key) // 从左往右找到比基准元素小的
left++;
if (left < right)
num[right] = num[left]; // 把小的交换到右边
}
num[left] = key; // 把基准元素赋值回去
return left;
}