首页 > 编程语言 >一.排序算法---并归排序

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

时间:2023-10-15 11:00:51浏览次数:34  
标签:arr right int mid --- 算法 排序 left

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

  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;
}

 

标签:arr,right,int,mid,---,算法,排序,left
From: https://www.cnblogs.com/ql201209/p/17764533.html

相关文章

  • 力扣---137. 只出现一次的数字 II
    给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。请你找出并返回那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 示例1:输入:nums=[2,2,3,2]输出:3示例2:输入:nums=[0,1,0,1,0,1,99]......
  • 2023-2024-1 20231312 《计算机基础与程序设计》第三周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>2023-2024-1-计算机基础与程序设计|||----这个作业要求在哪里|---<作业要求链接>2023-2024-1计算机基础与程序设计第一周作业-|----||这个作业的目标|《计算机基础概论》第2,3章《C语言......
  • kubernetes client-go 避坑
    原文链接:https://www.cnblogs.com/gaorong/p/16939111.htmlinformercache中的数据是只读的,任何修改都先deepcopyinformercache中的数据是只读的,任何修改都应该先deepcopy出来,然后提交apiserver,利用apiserverinformerevent重新同步回cache中。如果直接修改cache中的数据......
  • 【ARMv8基础篇】CCI-400控制器简介
    CCI(CacheCoherentInterconnect)是ARM中的cache一致性控制器。CCI-400将互连和一致性功能结合到一个模块中。它支持多达两个ACE主节点的连接,例如:Cortex®-A7processorCortex-A15processorCortex-A17processorCortex-A53processorCortex-A57processorCCI-400还支持......
  • 文泰刻绘安装版下载-文泰刻绘安装版免费下载 详细安装流程
    文泰刻绘2010功能1、工具这个软件中会有很多的绘图工具可以使用,能够帮助用户们更加方便的绘制图片,这些工具非常好用。2、界面有着一个很赶紧的绘画界面,能够让用户们更好的使用里面的功能,在查看图片的时候可以更加明显。3、调整能够帮助用户们调整图片的位置,让用户们可以通过这个软......
  • r - How do I order by row.names in dataframe R语言 排序
     new_df<-df[order(row.names(df)),]REF:https://stackoverflow.com/questions/20295787/how-can-i-use-the-row-names-attribute-to-order-the-rows-of-my-dataframe-in-rhttps://stackoverflow.com/questions/25194196/how-do-i-order-by-row-names-in-dataframe......
  • 1987-2008年考研数二真题全面解析
    1987|1988|1989|1990|1991......
  • vc---cl编译器的选项
    VC(VisualC++)编译器是MicrosoftVisualStudio集成开发环境中的C++编译器,用于编译和构建C++应用程序。VC编译器有许多编译选项,用于控制编译过程和生成的可执行文件。以下是一些常见的VC编译器选项:编译选项:/c:只进行编译,不进行链接。/O1,/O2,/Ox:启用不同级别的优化。/Gm:生成函......
  • 【科研02】【代码复现】【代码分享】TransUnet-RoadExtract 道路提取【数据预处理-ras
    目录1.数据处理dataprocess1.1.类型转换RastertoPng1.2.边缘填充Resize1.2.1.填充Resizeimage1.2.1.填充Resizelabel1.3.批量裁剪Clip1.4.波段缩减3bandsto1band1.5.筛选图像Choose1.6.转换格式Transformtonpz1.7.读取列表ReadFilesToList1.数......
  • CF237D T-decomposition
    原题链接链式前向星,他来了通过观察发现,每个集合的大小最小为\(2\),显然我们需要构造一种方案使得每一个集合的大小都为\(2\),这样是最优的。每个集合大小为\(2\),等价于把每条边转换成新树上的一个点,一共\(n-1\)边,对应\(n-1\)个集合,每个集合的点对在dfs的时候输出每一......