首页 > 编程语言 >C++ 归并排序

C++ 归并排序

时间:2023-09-08 14:33:37浏览次数:40  
标签:tmp mergesort 归并 nums int C++ vector l1 排序

#include <iostream>
#include <vector>
using namespace std;

/// 合并
void merge(vector<int>& nums, int l1, int r1, int l2, int r2, vector<int>& tmp) {
	int left = l1, right = r2;
    int k = l1;
    while(l1<=r1 && l2<=r2) {
        while (nums[l1] < nums[l2] && l1 <= r1) {
            tmp[k++] = nums[l1++];
        }

        while (nums[l1] >= nums[l2] && l2 <= r2) {
            tmp[k++] = nums[l2++];
        }
    } 

    while (l1 <= r1) {
        tmp[k++] = nums[l1++];
    }

    while (l2 <= r2) {
        tmp[k++] = nums[l2++];
    }
	
	for (int i=left; i<= right; ++i) {
		nums[i] = tmp[i];
	}
}

/// 拆分
void mergesort(vector<int>& nums, int l, int r, vector<int>& tmp) {
    if (l == r) {
        return ;
    }

    mergesort(nums, l, (l+r)/2, tmp);
    mergesort(nums, (l+r)/2+1, r, tmp);

    merge(nums, l, (l+r)/2, (l+r)/2+1, r, tmp);
}

/// 归并入口
void mergesort(vector<int>& nums) {
    int n = nums.size();
    if (n < 2) {
        return ;
    }
    vector<int> tmp(n);
    
    mergesort(nums, 0, n-1, tmp);

}


int main()
{
   vector<int> nums = {2, 3, 1, 9, 7, 8, 6, 4, 5};
	mergesort(nums);
	
	for (auto &ele : nums) {
		cout << ele << endl;
	}
	return 0;
}

标签:tmp,mergesort,归并,nums,int,C++,vector,l1,排序
From: https://www.cnblogs.com/xiaohaigegede/p/17687512.html

相关文章

  • 归并排序(mege sort)
    参考:https://www.cnblogs.com/kite97/p/13441391.html#include<iostream>#include<vector>#include<algorithm>#include<random>#include<chrono>usingnamespacestd;usingnamespacechrono;voidSwap(int*arr,intidxA,in......
  • Androidstudio现有文件中添加C、C++文件 (NDK)
    创建新的C/C++源代码文件1.如果应用的主源代码集内还没有cpp/目录,请按如下所示的方法创建一个:1.1打开AndroidStudio左侧的Project窗格,然后从菜单中选择Project视图。1.2依次选择your-module>src。1.3右键点击main目录,然后依次选择New>Dire......
  • 线程安全的队列:使用Monitor模式和C++11多线程库
    线程安全的队列:使用Monitor模式和C++11多线程库引言在多线程编程中,数据共享是一个关键的问题。如果多个线程需要访问同一个数据结构,不正确的管理会导致数据不一致甚至程序崩溃。本文将介绍如何使用C++11的多线程库和Monitor模式来实现一个线程安全的队列。Monitor模式Monitor模式......
  • effective c++笔记
    一.截图1. public继承,No32,Pg155 2.不重定义继承而来的缺省参数值,No37,Pg183 ......
  • C++中的多态和虚函数
    #include<iostream>usingnamespacestd;//基类PeopleclassPeople{public:People(char*name,intage);voiddisplay();protected:char*m_name;intm_age;};People::People(char*name,int......
  • C++ set排序去重
    对一组输入的数据进行排序。对输入的数据,我们有如下的约定:所有的输入数据都为正整数,且都不大于300000000。但是输入的数据可能会有重复,排序时,应将重复的数据合并,即同样的数只处理一次。输入只有一组数据,以0结尾。输出输出排序后的数据(不含0),其中相同的数应只显示1个。样例输入1......
  • C++学习笔记
    练习打印金字塔goto跳转语句for循环for(表达式1;表达式2;表达式3)------外层循环{循环语句块1;for(表达式4;表达式;表达式6)-------内层循环{循环语句块2}//循环语句块1;}表达式1----->赋值语句---->用来初始化----->可......
  • C++中的 class和struct区别
    C++中保留了C语言的struct关键字,并且加以扩充。在C语言中,struct只能包含成员变量,不能包含成员函数。而在C++中,struct类似于class,既可以包含成员变量,又可以包含成员函数。C++中的struct和class基本是通用的,唯有几个细节不同:使用class时,类中的成员默认都是private属性......
  • drf-排序、过滤、分页、异常处理
    一、排序只有5个接口中的查询所有,才涉及到排序,所以继承GenericViewSet, 使用步骤:1.必须写在继承:GenericAPIView类的视图中才行2.配置类属性:filter_backends=[OrderingFilter]ordering_fields=['id','user_type']#可以排序的字段3.使用:......
  • 【C++】C++ 引用详解 ⑦ ( 指针的引用 )
    文章目录一、二级指针可实现的效果二、指针的引用1、指针的引用等同于二级指针(重点概念)2、引用本质-函数间接赋值简化版本3、代码示例-指针的引用一、二级指针可实现的效果指针的引用效果等同于二级指针,因此这里先介绍二级指针;使用二级指针作为参数,可......