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

并归排序算法

时间:2023-03-16 10:33:24浏览次数:40  
标签:arr int ++ 算法 数组 排序 size

【说明】

采用归并排序对 n 个元素进行递增排序时,首先将 n 个元素的数组分成各含/2 个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排好序的子数组得到排序结果。
下面的 C 代码是对上述归并算法的实现,其中的常量和变量说明如下:

  • A:待排序数组
    
  • l,c,r:一个子数组的位置为从 l 到 c,另一个子数组的位置为从 c+1 到 r
    
  • arr_l_size,arr_r_size:两个子数组的长度
    
  • L,R:临时存放待合并的两个子数组
    
  • i,j,k:循环变量
    

【代码实现】

#include <limits.h>
#include <stdio.h>

void merge(int A[], int l, int c, int r) {
    int arr_l_size = c - l + 1; // 左边数组的大小
    int arr_r_size = r - c; // 左边数组的大小
    int i, j, k;
    int L[50], R[50];

    for (i = 0; i < arr_l_size; i++) {
        L[i] = A[l + i];
    }

    for (j = 0; j < arr_r_size; j++) {
        R[j] = A[c + j + 1];
    }

    L[arr_l_size] = INT_MAX;
    R[arr_r_size] = INT_MAX;

    i = 0;
    j = 0;

    for (k = l; k < r + 1; k++) {
        if (L[i] < R[j]) {
            A[k] = L[i];
            i++;
        } else {
            A[k] = R[j];
            j++;
        }
    }


    for (int s = 0; s < r + 1; s++) {
        printf("%d", A[s]);
    }
    printf("\n");
}

void mergerSort(int A[], int l, int r) {
    int c;
    if (l < r) {
        c = (l + r) / 2;
        mergerSort(A, l, c);
        mergerSort(A, c + 1, r);
        merge(A, l, c, r);
    }
}

//  0       1       2    |    3         4       5       6
//  l               c    |   c+1                r     length
//  2       5       6    |    1         4       7

// L[] = {2, 5, 6}          R[] = {1, 4, 7}

int main() {
    int A[] = {2, 5, 6, 1, 4, 7};
    int length = sizeof(A) / sizeof(int);
    mergerSort(A, 0, length - 1);
    printf("排序后的数组:");
    for (int i = 0; i < length; i++) {
        printf("%d", A[i]);
    }
    return 0;
}

标签:arr,int,++,算法,数组,排序,size
From: https://www.cnblogs.com/Smile-yun-1996/p/17221373.html

相关文章

  • 基于形态学处理算法的迷宫路线搜索matlab仿真
    1.算法描述形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如......
  • 基于形态学处理算法的迷宫路线搜索matlab仿真
    1.算法描述       形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本......
  • 代码随想录算法训练营第一天| javascript |二分查找_LeetCode704, 移除元素_LeetCode2
    二分查找题目链接:https://leetcode.cn/problems/binary-search/文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html视频讲解:ht......
  • 「AcWing学习记录」拓扑排序
    AcWing848.有向图的拓扑序列原题链接图的拓扑序列是针对有向图来说的,无向图是没有拓扑序列的。可以证明,有向无环图一定存在一个拓扑序列,所以有向无环图也被称为拓扑图......
  • 基尔排序——C语言描述
    基尔排序——C语言描述目录基尔排序——C语言描述0测试用例框架1定义2代码4测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?......
  • 图神经网络-图游走算法核心代码SkipGram、Node2Vec实现
    图神经网络-图游走算法核心代码SkipGram、Node2Vec实现1.DeepWalk采样算法对于给定的节点,DeepWalk会等概率的选取下一个相邻节点加入路径,直至达到最大路径长度,或者没......
  • 图神经网络-图游走算法核心代码DeepWalk实现
    本文主要涉及图游走算法DeepWalk的代码实现。1.DeepWalk采样算法对于给定的节点,DeepWalk会等概率的选取下一个相邻节点加入路径,直至达到最大路径长度,或者没有下一个......
  • 数组模拟环形队列java(数据结构与算法)
    思路:背景队列有两种实现方式:1、数组,2、链表在数组实现队列时,有的教科书中只说了队列满的条件是(rear+1)%manSize=front这个公式真让人摸不着头脑原来:这是数组模拟环......
  • 算法 -- 正则表达式匹配 (动态规划)
    原题:10.正则表达式匹配困难3.5K相关企业给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.'匹配任意单个字符'*'匹配零个......
  • 排序算法 之 (快速排序)
    10.3、快速排序算法思想在待排序表[1...n]中任取一个元素pivot作为枢轴(基准,通常去首元素),通过一趟排序将待排序表划分为独立的两部分L[1...k-1]和L[k+1...n],使得L[1...k-......