117.info
人生若只如初见

C++归并排序的递归与非递归实现

递归实现C++代码如下:

#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 L(n1);
    std::vector R(n2);

    for (int i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (int j = 0; j < n2; j++) {
        R[j] = arr[mid + 1 + j];
    }

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

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

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

    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 arr = {12, 11, 13, 5, 6, 7};
    int n = arr.size();

    mergeSort(arr, 0, n - 1);

    std::cout << "Sorted array: ";
    for (int i = 0; i < n; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

非递归实现C++代码如下:

#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 L(n1);
    std::vector R(n2);

    for (int i = 0; i < n1; i++) {
        L[i] = arr[left + i];
    }
    for (int j = 0; j < n2; j++) {
        R[j] = arr[mid + 1 + j];
    }

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

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

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

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

void mergeSort(std::vector<int>& arr) {
    int n = arr.size();
    int curr_size;
    int left_start;

    for (curr_size = 1; curr_size <= n - 1; curr_size = 2 * curr_size) {
        for (left_start = 0; left_start < n - 1; left_start += 2 * curr_size) {
            int mid = std::min(left_start + curr_size - 1, n - 1);
            int right = std::min(left_start + 2 * curr_size - 1, n - 1);

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

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

    std::cout << "Sorted array: ";
    for (int i = 0; i < arr.size(); i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

这两种方法都是通过将数组分成两半,递归或迭代地对每一半进行排序,然后再将两个有序的子数组合并成一个有序的数组。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe2d4AzsIAwFTBVc.html

推荐文章

  • c# listviewitem性能优化方法

    在优化C# ListView 控件的性能时,可以考虑以下几种方法: 使用虚拟模式:ListView 控件有一个属性叫做 VirtualMode,当设置为 true 时,只有在需要显示某个项的...

  • c# listviewitem与数据库如何交互

    在C#中,ListView控件通常用于显示数据库中的数据。要将ListViewItem与数据库进行交互,可以使用ADO.NET来连接和操作数据库。以下是一些基本步骤: 连接数据库:...

  • c# listviewitem如何动态添加

    在C#中,可以通过ListView的Items属性来动态添加ListViewItem。以下是一个示例代码:
    // 创建一个ListView对象
    ListView listView1 = new ListView();...

  • c# listviewitem事件处理技巧

    在C#中,ListView控件通常用来显示数据列表,如何处理ListViewItem的事件是很常见的问题。以下是一些处理ListViewItem事件的技巧: 通过ListView的ItemSelection...

  • 为什么要使用C++单链表而非数组

    使用C++单链表而非数组的原因有以下几点: 动态性:单链表的长度可以动态地增长或缩减,而数组的长度是固定的。如果需要在运行时动态地添加或删除元素,使用单链...

  • C++单链表如何实现

    在 C++ 中,可以使用类来实现单链表。下面是一个简单的单链表的实现示例:
    #include // 定义链表节点结构
    struct Node { int data; Node* next; Node(...

  • C++ dlopen和静态链接有何不同

    dlopen是一个函数,可用于在运行时动态加载共享库,并检索对其导出函数的指针。它允许程序在运行时决定加载哪个共享库,并且可以实现插件式架构。静态链接是在编...

  • C++ dlopen在游戏开发中如何使用

    在游戏开发中,C++ 的 dlopen 函数可以用于动态加载共享库文件,比如用于加载游戏中的插件或者模块。通过使用 dlopen 函数,游戏可以实现模块化设计,方便添加、...