测试数据:
快速排序-知识总结 解决问题 对一组线性存储的数据进行排序。
核心思想 快速排序的核心思想是“分治法”(Divide and Conquer)。它通过一个称为“基准”(pivot)的元素来将数组分割(partition)成两个子数组。子数组中的元素比基准小的放在一边,比基准大的放在另一边。这一过程称为分区操作。然后,递归地在两个子数组上应用同样的方法,直到数组的大小缩减到1,即每个子部分只包含一个元素。
工作原理 原理介绍 快速排序的步骤主要包括: 选择基准:从数组中选择一个元素作为基准点,常见的选择方法有随机选取、选择第一个元素或最后一个元素等。 分区操作: 将数组重新排列,所有比基准小的元素都移动到基准的左边,所有比基准大的元素都移动到基准的右边。确切的位置在哪里并不重要,重要的是基准左边的元素都比它小,右边的都比它大。 这个过程结束时,基准元素位于其最终位置。 递归排序: 对基准左侧和右侧的两个子数组递归地执行上述步骤。
代码模板
1#include<iostream>
2#include<algorithm>
3#include<vector>
4#include "stdio.h"
5#include "time.h"
6using namespace std;
7
8int a[10000005] = {0};
9
10// 该函数用于将数组a的一个段[a[left], a[right]]按照基准值base进行划分
11int partition(int a[], int left, int right) {
12 int base = a[left]; // 选择基准值为当前段的第一个元素
13 while (left < right) {
14 // 从右向左扫描,找到第一个小于基准值的元素
15 while (left < right && a[right] >= base) {
16 right--;
17 }
18 a[left] = a[right]; // 将找到的小于基准值的元素移动到左边
19
20 // 从左向右扫描,找到第一个大于等于基准值的元素
21 while (left < right && a[left] < base) {
22 left++;
23 }
24 a[right] = a[left]; // 将找到的大于等于基准值的元素移动到右边
25 }
26 a[left] = base; // 将基准值放到最终的位置
27 return left; // 返回基准值最终的索引
28}
29
30// 快速排序函数,递归地对数组的一段进行排序
31void quick_sort(int a[], int left, int right) {
32 if (left >= right) {
33 return; // 如果当前段的长度为1或为空,则不需要排序
34 }
35 int mid = partition(a, left, right); // 对当前段进行划分,获得基准值的索引
36
37 quick_sort(a, left, mid - 1); // 递归地对基准值左边的子段进行快速排序
38 quick_sort(a, mid + 1, right); // 递归地对基准值右边的子段进行快速排序
39}
40
41int main() {
42 int n = 0;
43 cin >> n;
44 for (int i = 0; i < n; i++) {
45 cin >> a[i];
46 }
47 quick_sort(a, 0, n - 1);
48 for (int i = 0; i < n; i++) {
49 cout << a[i] << ' ';
50 }
51 cout << endl;
52 return 0;
53}算法评价 时间复杂度: 最好情况:O(nlogn),当分区操作每次都能将数组分成两个几乎相等的子数组时。 平均情况:O(nlogn),对于随机排列的数组通常是这样。 最坏情况:O(n^2),当数组已经接近排序完成或完全倒序时,每次分区只能减少一个元素。 空间复杂度: 快速排序的空间复杂度依赖于递归的深度,可以通过在代码中递归较短的子数组来优化。 最好情况:O(logn),平衡分区。 最坏情况:O(n),不平衡分区。 稳定性:不稳定排序
优点与缺点 优点: 高效:在大多数情况下非常快,尤其是在内存访问模式上优于其他O(nlogn)O(n \log n)O(nlogn)算法,如归并排序。 就地排序:除了递归所需的栈空间外,几乎不需要额外空间。 缺点: 不稳定:相等的元素可能因分区而改变相对位置。 最坏情况性能:虽然不常见,但在已经几乎排序好的数组上表现不佳。
总结作业非常重要,请务必认真完成✔️
考试只有一次提交机会,请务必本地检查正确后再提交❇️
