蓝桥杯省赛无忧 课件43 快速排序

蓝桥杯省赛无忧 课件43 快速排序_第1张图片

01 快速排序的思想

蓝桥杯省赛无忧 课件43 快速排序_第2张图片

02 快速排序的实现

蓝桥杯省赛无忧 课件43 快速排序_第3张图片
蓝桥杯省赛无忧 课件43 快速排序_第4张图片蓝桥杯省赛无忧 课件43 快速排序_第5张图片

03 例题讲解

蓝桥杯省赛无忧 课件43 快速排序_第6张图片

#include 
#include 
using namespace std;
// 用于交换元素的辅助函数
void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}
// 快速排序的分区函数
int partition(vector<int>& arr, int low, int high) {
    // 选择最后一个元素作为基准
    int pivot = arr[high];
    int i = (low - 1);
    for (int j = low; j <= high - 1; j++) {
        // 当前元素小于或等于基准
        if (arr[j] <= pivot) {
            i++;    // 增加小于基准的元素的索引
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}
// 快速排序的主函数
void quickSort(vector<int>& arr, int low, int high) {
    if (low < high) {
        // pi 是分区索引,arr[pi] 现在放在正确的位置
        int pi = partition(arr, low, high);
        // 分别对分区前后的元素进行递归排序
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}
int main() {
    int n;
    cin >> n;
    vector<int> treasures(n);
    for (int i = 0; i < n; i++) {
        cin >> treasures[i];
    }
    quickSort(treasures, 0, n - 1);
    for (int i = 0; i < n; i++) {
        cout << treasures[i] << (i < n - 1 ? " " : "\n");
    }
    return 0;
}

代码分析:

辅助函数 swap

void swap(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

这个函数用于交换两个整数变量的值。它接受两个整数的指针作为参数,并通过中间变量t来交换ab指向的值。

分区函数 partition

int partition(vector<int>& arr, int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);

    for (int j = low; j <= high - 1; j++) {
        if (arr[j] <= pivot) {
            i++;
            swap(&arr[i], &arr[j]);
        }
    }
    swap(&arr[i + 1], &arr[high]);
    return (i + 1);
}

partition 函数实现了快速排序中的分区操作。它接受一个数组arr和两个索引lowhigh作为参数:

  • pivot是基准值,这里选择数组的最后一个元素作为基准。
  • i作为小于基准值序列的游标。
  • 循环中,如果发现元素arr[j]小于或等于pivot,就将其移到数组的左侧(通过交换arr[i]arr[j])。
  • 最后,将基准值放在其正确的位置上(即arr[i+1])。
  • 函数返回基准值的新索引,此时基准值左侧的所有元素都小于它,右侧的都大于它。

快速排序函数 quickSort

void quickSort(vector<int>& arr, int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

quickSort 函数递归地对数组arr进行排序:

  • 它首先检查low是否小于high,如果不是,意味着子数组已经是一个元素或者空,不需要排序。
  • pi是通过partition函数返回的分区后基准值的索引。
  • 接着,函数对基准值左侧和右侧的两个子数组递归地调用quickSort

主函数 main

int main() {
    int n;
    cin >> n;
    vector<int> treasures(n);
    for (int i = 0; i < n; i++) {
        cin >> treasures[i];
    }

    quickSort(treasures, 0, n - 1);

    for (int i = 0; i < n; i++) {
        cout << treasures[i] << (i < n - 1 ? " " : "\n");
    }

    return 0;
}

main函数中:

  • 程序首先从用户那里读取宝藏的数量n
  • 它声明了一个vector类型的数组treasures用于存储这些宝藏的价值。
  • 用户输入宝藏的价值,并存储在treasures数组中。
  • 调用quickSort函数对数组进行排序。
  • 排序后,程序打印出排序后的宝藏价值列表。每个值后面跟着一个空格,除了最后一个值后面跟着一个换行符。

在这个代码中,快速排序算法利用了递归和分区策略来高效地对数据进行排序,特别适合处理大量数据。由于partition函数的效率及递归的高效性,快速排序通常比较快,平均时间复杂度为O(n log n),但在最差情况下是O(n^2)。由于代码中的基准选择是固定的(最后一个元素),在最坏的情况下可能会达到最差性能,例如当输入已经是有序时。在实际应用中,通常会使用随机化版本的快速排序来避免这个问题。

你可能感兴趣的:(蓝桥杯省赛无忧,蓝桥杯,排序算法,算法,c++,快速排序)