首页 > 其他分享 >排序6-归并排序

排序6-归并排序

时间:2024-04-25 23:22:58浏览次数:31  
标签:tmp 归并 end int arr start 排序

排序6-归并排序



归并排序思路

每次将序列分为二组, 如果这两组数据是有序的, 在辅助空间进行排序.

细分至只有一个数据时序列是有序的, 从此开始向上合并临近小组


分组合并

//分组合并, 将要合并的两个序列按大小填入辅助空间中
void Merge(int arr[], int start, int end, int mid, int *tmp){
    //有序序列1
    int i_start = start;
    int i_end = mid;
    //有序序列2
    int j_start = mid+1;
    int j_end = end;
    //表示辅助空间有多少元素
    int length = 0;
    //合并两个有序序列,选取较小元素填入tmp
    while(i_start<=i_end && j_start<=j_end){ //两个序列有一个遍历完后退出循环
        if(arr[i_start]<arr[j_start]){
            tmp[length] = arr[i_start];
            length++;
            i_start++;
        }else{
            tmp[length] = arr[j_start];
            length++;
            j_start++;
        }
    }
    //j序列遍历完毕, i序列剩余放入tmp
    while(i_start<=i_end){
        tmp[length++] = arr[i_start++];
    }
    //i序列遍历完毕, j序列剩余放入tmp
    while(j_start<=j_end){
        tmp[length++] = arr[j_start++];
    }
    //辅助空间数据覆盖原空间
    for (int i = 0; i < length; i++){
        arr[start+i] = tmp[i];
    }
}

归并排序

//归并排序
void mergeSort(int arr[], int start, int end, int *tmp){
    //start>=end时,停止排序
    if(start>=end){
        return;
    }
    int mid = (start+end)/2;
    //分组
    //左
    mergeSort(arr,start, mid, tmp);
    //右
    mergeSort(arr,mid+1,end,tmp);
    //合并
    Merge(arr, start, end, mid, tmp);
}

创建序列

//创建序列
int* createArray(){
    srand((unsigned int)time(NULL));
    int *arr = (int*)malloc(sizeof(int) * MAX);
    for (int i = 0; i < MAX; i++){
        arr[i] = rand() % MAX;
    }
    return arr;
}

打印数组

//打印数组
void PrintArray(int arr[],int len){
    for (int i = 0; i < len; i++){
        cout << arr[i] << " ";
    }
    cout << endl;    
}

测试

int main(){
    int *myArr = createArray();
    PrintArray(myArr,MAX);
    //创建辅助空间
    int *tmp = (int*)malloc(sizeof(int) * MAX);
    //排序
    mergeSort(myArr,0,MAX-1,tmp);
    PrintArray(myArr,MAX);
    //释放资源
    free(tmp);
    free(myArr);

    system("pause");
    return 0;
}

标签:tmp,归并,end,int,arr,start,排序
From: https://www.cnblogs.com/HIK4RU44/p/18158910

相关文章

  • DRF之过滤 排序 分页
    DRF之过滤排序分页使用【过滤排序分页】都需要在继承了GenericAPIView的视图类下使用并指定类属性【queryset和serializer_class】【一】过滤#所有过滤类都继承【BaseFilterBackend】fromrest_framework.filtersimportBaseFilterBackend【1】drf自带的过滤#......
  • 笔记:拓扑排序
    定义拓扑排序(Topologicalsorting),是对一个DAG排序的算法。对于排序后的序列\(s\),设\(t_i\)是节点\(i\)在\(s\)中的位置,那么该DAG上的每条边\(u\tov\),\(t_u<t_v\)。换句话说,就是每条边\(u\tov\),\(u\)不能在\(v\)的后面。模板link。考虑两种算法,分别基于广......
  • 二分法,冒泡排序
    Ⅰ算法之二分法算法其实就是解决问题的有效方法'''二分法使用有前提:数据集必须有先后顺序(升序,降序)''''''二分法原理 获取数据集中间的元素比对大小 如果中间元素大于目标数据那么保留数据集的左边一半 如果中间元素小于目标数据那么保留数据集的右边一半 针对剩......
  • 冒泡排序
    packageArray;importjava.util.Arrays;//冒泡排序//1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置//2.每一次比较,都会产生一个最大,或者最小的数字//3.下一轮测试可以少一次排序//4.依次循环,直到结束publicclassDemo06{publicstaticvoid......
  • 笔记/C++中的数组排序
    在C++中,std::sort函数是一个用于对容器(如数组、向量等)进行排序的通用算法。它定义在<algorithm>头文件中,并接受两个迭代器参数,分别指向要排序的范围的开始和结束位置。此外,std::sort还可以接受一个可选的比较函数或lambda表达式,用于自定义排序规则。以下是std::sort函数的基本用......
  • 风险控制 1、如果你的项目发布后失败,主要的原因会是什么? 2、每个团队列出自己项目中
    项目发布失败的主要原因会是:-需求管理不当:项目未能准确捕捉或满足用户需求。资源分配不当:团队可能缺乏必要的技能或资源来完成项目。时间管理问题:项目可能未能在预定时间内完成。沟通不畅:团队成员之间、团队与利益相关者之间的沟通可能存在问题。技术问题:项目可能遇到无法......
  • 排序5-快速排序
    排序5-快速排序快速排序(正序)利用分而治之的思想+挖坑填数排序,选择一个基准数,将小于基准数的元素全部放在基准数左边,大于基准数的元素全部放在基准数右侧.再对剩下的部分进行快速排序快速排序c++实现(正序)//快速排序(正序)voidquickSort(i......
  • 双向循环链表:(创建、插入、遍历、求长、查找、删除、排序、销毁)待测
    目录一、双向循环链表存在的意义二、节点的定义三:实现1:创建链表(即创建一个空链表)2:创建新结点3:遍历4:插入头插入尾插入中间插入一、双向循环链表存在的意义数组这样的结构提供了连续内存的访问和使用,链表是对内存零碎空间的有效组织和使用,双向循环链表增大了访问的自由度。二、......
  • 团队练习2:风险控制 1、如果你的项目发布后失败,主要的原因会是什么? 2、每个团队列出自
    学生信息管理系统项目发布后失败的主要原因可能包括:需求分析不准确或不完整,导致系统功能与用户需求不符。技术实现存在问题,如性能低下、安全性不足等。项目管理不善,如进度延误、资源分配不合理等。用户界面设计不佳,导致用户体验差。市场推广不足,用户接受度低。项目中目前面......
  • Python list的交、并、差与排序
    求list的交集、并集、差集set() 函数创建一个无序不重复元素集,通过set可方便求取list的交并差,并可去重#通过set集合>>>list1=[1,2,3]>>>list2=[2,3,4]>>>set1=set(list1)>>>set2=set(list2)>>>set1&set2#交集{2,3}>>>set1|set......