蓝桥杯省赛无忧 课件44 归并排序

蓝桥杯省赛无忧 课件44 归并排序_第1张图片

01 归并排序的思想

蓝桥杯省赛无忧 课件44 归并排序_第2张图片

02 归并排序的实现

蓝桥杯省赛无忧 课件44 归并排序_第3张图片蓝桥杯省赛无忧 课件44 归并排序_第4张图片

03 例题讲解

蓝桥杯省赛无忧 课件44 归并排序_第5张图片

#include 
#include 
using namespace std;
// 合并两个有序数组
void merge(vector<int>& array, int start, int mid, int end, vector<int>& temp) {
    int i = start;
    int j = mid + 1;
    int k = start;
    // 合并两个有序数组
    while (i <= mid && j <= end) {
        if (array[i] <= array[j]) {
            temp[k++] = array[i++];
        } else {
            temp[k++] = array[j++];
        }
    }
    // 如果左侧数组还有剩余,将它们复制到临时数组
    while (i <= mid) {
        temp[k++] = array[i++];
    }
    // 如果右侧数组还有剩余,将它们复制到临时数组
    while (j <= end) {
        temp[k++] = array[j++];
    }
    // 将排序好的临时数组复制回原数组
    for (i = start; i <= end; i++) {
        array[i] = temp[i];
    }
}
// 归并排序函数
void mergeSort(vector<int>& array, int start, int end, vector<int>& temp) {
    if (start < end) {
        int mid = start + (end - start) / 2;  // 防止溢出的写法
        mergeSort(array, start, mid, temp);    // 排序左半部分
        mergeSort(array, mid + 1, end, temp);  // 排序右半部分
        merge(array, start, mid, end, temp);   // 合并两个有序数组
    }
}
int main() {
    int n;
    cin >> n;
    vector<int> array(n);  // 宝藏数组
    vector<int> temp(n);   // 用于合并的临时数组
    // 读取宝藏的珍贵程度
    for (int i = 0; i < n; i++) {
        cin >> array[i];
    }
    // 调用归并排序
    mergeSort(array, 0, n - 1, temp);
    // 打印排序后的结果
    for (int i = 0; i < n; i++) {
        cout << array[i] << (i < n - 1 ? " " : "\n");
    }
    return 0;
}

这是一个经典的递归排序算法,它非常适合于处理大数据集。
代码分析:

merge函数: (void merge(vector& array, int start, int mid, int end, vector& temp)):

  • 该函数执行实际的归并操作,将两个有序的子数组合并成一个有序数组。
  • startmid,和end参数定义了需要合并的数组部分的边界。
  • temp是一个临时向量,用于在合并过程中存放临时元素。
  • 在合并过程中,使用三个索引变量ij,和k跟踪当前操作的元素的位置。
  • 两个内部循环确保将array数组从startmid和从mid+1end的两个部分正确合并到temp数组中。
  • 最后,将临时数组temp中的有序元素复制回原始数组array的相应位置。

mergeSort函数: (void mergeSort(vector& array, int start, int end, vector& temp)):

  • 该函数是归并排序的核心,它递归地将数组分为两部分,分别对它们进行排序,然后使用merge函数将它们合并。
  • 它使用startend参数来确定当前递归操作的数组段。
  • mid计算为startend的中点,这是把数组划分为两部分的依据。
  • 递归地对数组的左半部分和右半部分调用mergeSort函数进行排序。
  • 之后,调用merge函数将两个已排序的子数组合并成一个有序数组。

main函数:

  • 它是程序的入口点。
  • 首先读取一个整数n,它代表数组中元素的数量。
  • 定义两个向量arraytemp,分别用于存储用户输入的整数和归并过程中的临时数据。
  • 通过一个循环从标准输入读取n个整数到array向量中。
  • 调用mergeSort函数使用归并排序算法对数组进行排序。
  • 最后,通过一个循环输出排序后的数组元素。

该程序遵循了归并排序算法的典型实现,即分而治之的策略,首先递归地将问题分解成更小的部分,然后合并这些部分以得到最终的有序数组。归并排序的时间复杂度通常是O(n log n),其中n是数组中元素的数量,这使得它对于大型数据集来说是一种非常有效的排序算法。

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