分治算法之归并排序

分治算法是一种将问题分解成更小子问题,然后合并子问题的解以获得原问题解的算法策略。分治算法通常包括三个步骤:分解、解决、合并。

下面是一个经典的分治算法实例:归并排序

归并排序

归并排序是一种经典的分治排序算法,它将一个数组分成两个子数组,分别对这两个子数组进行排序,然后合并这两个有序子数组,从而得到整个数组的有序序列。

#include 
#include 

void merge(std::vector<int>& arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    std::vector<int> leftArr(n1);
    std::vector<int> rightArr(n2);

    for (int i = 0; i < n1; ++i) {
        leftArr[i] = arr[left + i];
    }

    for (int j = 0; j < n2; ++j) {
        rightArr[j] = arr[mid + 1 + j];
    }

    int i = 0, j = 0, k = left;

    while (i < n1 && j < n2) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k++] = leftArr[i++];
        } else {
            arr[k++] = rightArr[j++];
        }
    }

    while (i < n1) {
        arr[k++] = leftArr[i++];
    }

    while (j < n2) {
        arr[k++] = rightArr[j++];
    }
}

void mergeSort(std::vector<int>& arr, int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        mergeSort(arr, left, mid);
        mergeSort(arr, mid + 1, right);

        merge(arr, left, mid, right);
    }
}

int main() {
    std::vector<int> arr = {12, 11, 13, 5, 6, 7};

    std::cout << "Original Array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    mergeSort(arr, 0, arr.size() - 1);

    std::cout << "Sorted Array: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}
逐行解释:
  1. merge 函数:这个函数用于合并两个有序数组。在函数内部,我们创建了两个临时数组 leftArrrightArr,分别存储左半部分和右半部分的元素。然后,通过比较两个数组的元素,将它们有序地合并到原始数组 arr 中。

  2. mergeSort 函数:这个函数是归并排序的主要逻辑。它首先检查数组的大小,如果数组的大小大于1,则将数组分成两半并递归调用 mergeSort。然后,调用 merge 函数将两个有序的子数组合并。

  3. main 函数:在主函数中,我们定义了一个整数向量 arr,然后调用 mergeSort 函数对其进行排序。最后,输出排序前后的数组。

归并排序是一种高效且稳定的排序算法,它的时间复杂度为 O(n log n),其中 n 是数组的大小。

你可能感兴趣的:(算法,排序算法,数据结构)