首页 > 其他分享 >归并排序(mege sort)

归并排序(mege sort)

时间:2023-09-08 13:57:23浏览次数:29  
标签:sort tmp mege end arr int 归并 mid start

参考: https://www.cnblogs.com/kite97/p/13441391.html

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <chrono>
using namespace std;
using namespace chrono;

void Swap(int* arr, int idxA, int idxB)
{
    int tmp = arr[idxA];
    arr[idxA] = arr[idxB];
    arr[idxB] = tmp;
}

void MergeData(int* arr, int start, int mid, int end, int* tmp)
{
    //从start到mid是有序的(左边列表), 从mid到end也是有序的(右边列表)
    // 如 左边列表:[2, 5, 6, 7] 右边列表[1, 3, 5, 6]
    // 两边列表都从左向取值, 边取边比较
    // 申请一个临时空间来放数据
    int total = end - start;
    int left = start;
    int right = mid;
    for (int i = 0; i < total; ++i)
    {
        if (left >= mid && right < end)
        {
            //左边列表已经用完了, 放右边的
            tmp[i] = arr[right++];
        }
        else if (right >= end && left < mid)
        {
            //右边用完了, 左边还有
            tmp[i] = arr[left++];
        }
        else if (arr[left] < arr[right])
        {
            tmp[i] = arr[left++];
        }
        else
        {
            tmp[i] = arr[right++];
        }
    }
    //tmp里面的值复制到原arr中
    memcpy(&arr[start], tmp, sizeof(int) * total);
}

// 不含end
void MergeSort(int* arr, int start, int end, int* tmpArr)
{
    int len = end - start;
    if (len <= 1)
    {
        return;
    }
    else if (len == 2)
    {
        if (arr[start] > arr[start + 1])
        {
            Swap(arr, start, start + 1);
        }
        return;
    }
    int midLen = len >> 1;
    int mid = start + midLen;

   // cout << "start:" << start << ",end:" << end << endl;

    MergeSort(arr, start, mid, tmpArr);
    MergeSort(arr, mid, end, tmpArr);
    //合并
    MergeData(arr, start, mid, end, tmpArr);
}

int main()
{
    int maxSize = 50;
    srand(time(NULL));
    int* arr = new int[maxSize];
    cout << "data:\n";
    
    for (int i = 0; i < maxSize; ++i)
    {
        arr[i] = rand() % 100;
        cout << arr[i] << " ";
    }
    cout << "\nsorted data:" << endl;
    auto start = system_clock::now();
    auto startTick = duration_cast<chrono::milliseconds>(start.time_since_epoch()).count();
    int* tmpArr = new int[maxSize];
    MergeSort(arr, 0, maxSize, tmpArr);
    for (int i = 0; i < maxSize; ++i)
    {
        cout << arr[i] << " ";
    }
    cout << endl;
    auto endTick = duration_cast<milliseconds>(system_clock::now().time_since_epoch()).count();
    auto useTick = endTick - startTick;
    cout << "Use Time:" << useTick << flush;
    delete[] tmpArr;
    delete[] arr;
    system("pause");
    return 0;
}

 

标签:sort,tmp,mege,end,arr,int,归并,mid,start
From: https://www.cnblogs.com/barrysgy/p/17687362.html

相关文章

  • 基础:归并排序
    目录简介代码与实操分解合并代码简介归并排序属于一种分治法,简单来说就是将一个大问题分解成若干类似大问题的子问题,然后分别解决,最后进行合并。一般的分治法分为如下步骤:1、分解:把一个问题分解成若干更小的类似的子问题2、解决:递归解决子问题。当子问题足够小时,按照基础情况......
  • ES中reverse_nested+sum+bucket_sort
    记一次嵌套sum聚合的排序DSL场景:根据nested_gs2Entity.kw_entity聚合,filter对聚合结果过滤类型是产品,实体是需要关心的产品列表,在结果中sum互动量long_interaction,和花费long_paidPrice然后在结果中根据sum的结果排序{"aggregations":{"agg_entity_a":{"aggre......
  • python内置函数 - map, reduce, filter, sort
    1,map(fn,可迭代对象)参数fn为一个参数的函数lambda方式my_list=[2,3,4,5]result=map(lambdax:x*x,my_list)#返回元素平方值的迭代器print(type(result))#<class'map'>print(isinstance(result,collections.abc.Iterator))#Truenew_list=list(re......
  • Java 归并排序
    思路数组排序主要分为两个部分:划分数组和归并排序。划分数组:将待排序的无序数组分为左右两个部分,如果无序数组的起始元素下标为first,最后一个元素的下标为last,那么左右两部分之间的临界点下标mid=(first+last)/2,这两部分分别是arr[first…mid]和arr[mid+1…last];将上......
  • AGC057E RowCol/ColRow Sort【性质,DP】
    给定一个\(n\timesm\),值域\([0,9]\)的矩阵\(B\),计数有多少个大小相同的矩阵\(A\)满足下列条件:分别对\(A\)的每一列中元素从小到大排序,再分别对\(A\)的每一行中元素从小到大排序能够得到\(B\)。分别对\(A\)的每一行中元素从小到大排序,再分别对\(A\)的每一列中......
  • D. Sorting By Multiplication
    D.SortingByMultiplicationYouaregivenanarray$a$oflength$n$,consistingofpositiveintegers.Youcanperformthefollowingoperationonthisarrayanynumberoftimes(possiblyzero):choosethreeintegers$l$,$r$and$x$suchthat$1\lel......
  • MegEngine 7-8 双月报来啦:新版本发布,开发者福利课程,干货满满
    v1.13.1新版本发布MegCC新版本发布【MegEngine使用小技巧】系列文章1.《MegEngine使用小技巧:如何使用MegCC进行模型编译》2.《MegEngine使用小技巧:Profiler使用手册》Imperative介绍专栏1.《MegEnginePython层模块串讲(上)》2.《MegEnginePython层模块串讲(中)》3.《Meg......
  • B. Split Sort
    B.SplitSortYouaregivenapermutation$^{\dagger}$$p_1,p_2,\ldots,p_n$ofintegers$1$to$n$.Youcanchangethecurrentpermutationbyapplyingthefollowingoperationseveral(possibly,zero)times:choosesome$x$($2\lex\len$);create......
  • MegEngine 使用小技巧:Profiler使用手册
    0.写在前面“xx,R那边反应多机训练速度慢,你看一下什么情况”“xxx,为什么MGE更新之后,xxx网络训练变慢了,你看一下”这是组内日常对话然后有人日常背锅组员的状态是:提性能,提性能,还是TMD提性能据不完全统计,有80%的性能问题其实是因为训练代码写的不够好,让MGE有力使不出......
  • vue sort 排序
    Vue.js提供了多种实现排序的方式。下面列举了几种常见的排序方法及示例代码。 1、使用JavaScript原生的Array.prototype.sort()方法进行排序。这种方法适用于简单的数组排序需求。//在Vue组件中的方法中使用sort方法进行排序data(){return{myArray:[3,1,2,4......