首页 > 其他分享 >二路归并

二路归并

时间:2023-07-25 19:57:32浏览次数:20  
标签:归并 int 二路 有序 printf 子表 define

本文章的代码使用jetbrains公司旗下的的Clion编写,操作系统位macOS Ventura(13.2.1). 代码没有在dev-c++测试过(dev-c++可能会有相关的空格问题)

李春葆书

//
// Created by 魏志杰 on 2023/7/25.
//

#include "stdio.h"
#include "stdlib.h"

#define Max 100
#define before  printf("排序前")
#define after   printf("排序后")
#define newline printf("\n")
#define print   printf("%6d", R[i].key)
#define printA  printf("%6d",A[i])
#define Array int A[]={5,7,2,5,9,6,-42,1,67,2,3};


//begin merge sort

typedef struct {
    int key;
    int data;
} SqType;

//归并排序的基本思路是首先将R[0 n-1]看成是n个长度为1的有序表,将相邻的有序子表成对归并,得到n/2的长度为2的有序子表,然后再将这些有序子表成对归并
//得到n/4个长度为4的有序子表,如此反复,得到一个长度为n的有序子表



void Merge(SqType R[], int low, int mid, int high) {
    //将R[low mid] 和R[mid+1 high]两个相临的有序表归并为一个有序表
    SqType *R1;
    //k 是R1的的下标 ,i,j 分别为第1,2子表的下标
    int i = low, j = mid + 1, k = 0;
    R1 = (SqType *) malloc((high - low + 1) * sizeof(SqType));
    while (i <= mid && j <= high)           //在第1子表和第二子表均未扫描完时循环
        if (R[i].key <= R[j].key) {         //将第1子表的元素放入R1中
            R1[k] = R[i];
            i++;
            k++;

        } else {
            R1[k] = R[j];                   //将第2子表的元素放入R1中
            j++;
            k++;
        }
    while (i <= mid) {                      //将第1子表剩余元素放入R1中
        R1[k] = R[i];
        i++;
        k++;
    }
    while (j <= high) {                     //将第2子表剩余元素复制R1中
        R1[k] = R[j];
        j++;
        k++;
    }
    for (k = 0, i = low; i <= high; k++, i++)
        R[i] = R1[k];                       //将R1复制回R中
        free(R1);                           //释放R1所占的空间

}

void MergePass(SqType R[], int length, int n) {     //一趟二路归并
    int i;
    for (i = 0; i + 2 * length - 1 < n; i = i + 2 * length)  //归并length长度的两相邻子表
        Merge(R, i, i + length - 1, i + 2 * length - 1);
    if (i + length - 1 < n)                         //余下两个子表,后者长度小于length
        Merge(R, i, i + length - 1, n - 1);     //归并这两个子表

}


void MergeSort(SqType R[], int n) {
    int length;
    for (length = 1; length < n; length = 2 * length)
        MergePass(R, length, n);

}


int main() {
    SqType R[Max];
    Array;
    for (int i = 0; i < 10; i++)
        R[i].key = A[i];
    before;
    for (int i = 0; i < 10; i++)
        print;
    newline;
    MergeSort(R, 10);
    after;
    for (int i = 0; i < 10; i++)
        print;


}


代码结果如下

标签:归并,int,二路,有序,printf,子表,define
From: https://www.cnblogs.com/xiaozhounandu/p/17580827.html

相关文章

  • 快排/归并/二分
    排序快速排序主要思想:分治排序方式:确定分界点:左边界:q[l],中间值:q[(l+r)/2],右边界,或者随机调整区间:小于等于x的在x左半边,大于等于x的在x右半边(最难的部分)法一:开a[],b[]扫描一遍q[],q[i]>=xq[i]->a[];q[i]<=xq[i]->b[];a[]->q[]b[]->b[]法二(更优美):......
  • 3.归并排序
    publicstaticvoidmerge(int[]arr,intL,intM,intR){int[]help=newint[R-L+1];inti=0;intp1=L;intp2=M+1;while(p1<=M&&p2<=R){help[i++]=arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];}while(p1&......
  • Java版归并排序 演示代码(带注释)
    Code:importjava.util.Arrays;/***归并排序*/publicclassMergeSort{/***私有化*/privateMergeSort(){}/***归并排序的sort方法*@paramarr待排序数组*@param<E>可比较的元素*/publicstatic<Eex......
  • 归并排序思考记录与代码实现 --- 图画的真累
    归并排序把数组不断从中间拆分,然后对前后两段分别排序,再将排好序的两部分合并在一起如下图数组排序。——分治思想:把大问题分解为小问题来解决,这通常会用到递归。由代码可知,归并排序就是将数组不断地从中间切开,然后对每份切开的前后排进行排序两种不用额外空间的算法,在......
  • 冒泡、选择、插入、归并、快速排序代码
    importrandom#随机生成包含10个元素的数组random.seed(10)alist=[random.randint(1,100)for_inrange(10)]冒泡排序'''冒泡排序每轮相邻的两个元素,两两相比,此轮最大的元素,像泡泡一样移动到队列尾部。每次j和j+1位置比较,胜者冒出去'''defbubble_sort(arr)......
  • 【基础算法】八大排序算法:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序(快排)
    ✔️前言......
  • 归并排序-逆序对的数量
    归并排序-逆序对的数量原理略代码#include<iostream>usingnamespacestd;constintN=1e5+10;typedefunsignedlonglongULL;ints[N],tmp[N];ULLmergeSort(intl,intr){if(l>=r)return0;intmid=(l+r)>>1;ULLres=merg......
  • 归并和快速排序的递归实现
    最近学习了归并排序和快速排序,在这里写一篇博客用于复习并且检验自己是否有遗漏知识点的情况。归并排序归并排序的思想归并排序使用的思想为分治法。分治思想分为两部分第一部分为:分解,第二部分为合并。首先,将待排序的序列分成若干个子序列,每个子序列都是有序的。然后,再将这些有序的......
  • 29.归并排序
    研究了这么多算法以后,小桂子颇有收获,基本自认为排序算法已经全部掌握,于是就想卖弄一下自己的“算法内功”,另一方面为了交流推广,把这些算法传播出去,就召开一个全国算法大赛,集思广益,征集更牛逼的算法!在算法大赛上,有两位白发葱葱的老者提出的算法让小桂子自惭形秽,感叹良多。。。其......
  • 数据结构课程设计2023夏7-11 二路归并排序
    给定一个整数序列,请按非递减序输出采用二路归并排序(递归法)的各趟排序后的结果(每完成一次归并操作就输出归并后的结果)。输入格式:测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。输出格式:对于每组测试,输出若干行,每行是一趟排序后的......