一.排序算法---并归排序

一.并归排序(自定义实现)

  1. merge 函数:这个函数用于将两个已排序的子数组合并为一个更大的已排序数组。它包括创建临时数组 LR 来存储左半部分和右半部分的元素,然后比较这些元素并将它们按升序合并到原始数组 arr 中。

  2. mergeSort 函数:这个函数是归并排序的主要函数。它采用递归的方式将数组分为两半,然后递归地对左半部分和右半部分进行排序,最后再调用 merge 函数来合并已排序的两部分。

  3. main 函数:这是程序的入口点。它创建一个整数向量 arr,并在标准输出中打印原始数组的内容。然后,它调用 mergeSort 函数对 arr 进行排序,并再次打印排序后的结果。

#include <iostream>
#include <vector>

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

    // 创建临时数组
    std::vector<int> L(n1);
    std::vector<int> R(n2);

    // 复制数据到临时数组 L[] 和 R[]
    for (int i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (int i = 0; i < n2; i++) {
        R[i] = arr[mid + 1 + i];
    }

    // 归并临时数组到 arr[left..right]
    int i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        } else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }

    // 复制 L[] 的剩余元素
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }

    // 复制 R[] 的剩余元素
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}

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 = {38, 27, 43, 3, 9, 82, 10};

    std::cout << "原始数组: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

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

    std::cout << "归并排序后的数组: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

 二.并归函数(调用实现)

使用std::stable_sort

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> arr = {38, 27, 43, 3, 9, 82, 10};

    std::cout << "原始数组: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 使用 std::stable_sort 对数组进行排序
    std::stable_sort(arr.begin(), arr.end());

    std::cout << "稳定排序后的数组: ";
    for (int num : arr) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

posted @ 2023-10-15 10:51  Sairate  阅读(110)  评论(0)    收藏  举报