【算法】采用分治法实现按升序排序的自顶向下二路归并排序算法(C++源码)

【算法】采用分治法实现按升序排序的自顶向下二路归并排序算法(C++源码)

一、任务描述

请采用分治法实现按升序排序的自顶向下二路归并排序算法,设计测试用例以验证算法的准确性。
要求:使用STL中的vector存储输入数据以及中间数据

二、步骤描述

输入数组的个数,建立vector数组,建立合并算法merge(vector&a,vector&b,int l,int r,int m),建立合并排序递归算法mergesort(vector&a,vector&b,int l,int r),在左<右递归调用本身,输出排序后的vector数组。

三、程序运行结果截图

1
2
在这里插入图片描述

四、源代码-未使用vector(C++)

#include <iostream>
#include <cstring>
#include <cmath>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void merge_array(int* intArr1, int len1, int* intArr2, int len2)
{
    int*list=(int*)malloc((len1+len2)*sizeof(int));
    int i=0,j=0,k=0;
    while(i < len1 && j < len2)
    {
        // 把较小的那个数据放到结果数组里, 同时移动指针
        list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];
    }
        // 如果 intArr1 还有元素,把剩下的数据直接放到结果数组
    while(i < len1)
    {
        list[k++] = intArr1[i++];
    }
        // 如果 intArr2 还有元素,把剩下的数据直接放到结果数组
    while(j < len2)
    {
        list[k++] = intArr2[j++];
    }
        // 把结果数组 copy 到 intArr1 里
    for(i = 0; i < k; i++)
    {
        intArr1[i] = list[i];
    }
        //释放申请的空间
    free(list);
}

void merge_sort(int* intArr, int intArr_len)
{
    if(intArr_len > 1)
    {
        int* intArr1 = intArr;
        int intArr1_len = intArr_len/2;
        int* intArr2 = intArr + intArr_len/2;
        int intArr2_len = intArr_len - intArr1_len;
        merge_sort(intArr1,intArr1_len);
        merge_sort(intArr2,intArr2_len);
        merge_array(intArr1, intArr1_len, intArr2, intArr2_len);
    }
}

int main()
{
    int n,i;
    cout<<"Please put the size of intArr:";
    cin>>n;
    int intArr[n];
    cout<<"Please put the number of intArr:";
    for(i=0;i<n;i++)
    {
        cin>>intArr[i];
    }
    merge_sort(intArr,n);
    cout<<"Output the inArr after sorting:";
    for(i=0;i<n;i++)
    {
        cout<<intArr[i]<<" ";
    }
    cout<<endl;
    return 0;
}

五、源代码-使用vector(C++)

#include<iostream>
#include<vector>

using namespace std;

void merge(vector<int>&a,vector<int>&b,int l,int r,int m)
{
    int i,j,id1,id2;
    for(j=l;j<=r;j++)
    {
        b[j]=a[j];
        id1=l;
    }
    i=1;
    id2=m+1;
    while(id1<=m&&id2<=r)
    {
        if(b[id1]<=b[id2])
        {
            a[i++]=b[id1++];
        }
        else a[i++]=b[id2++];
    }
    while(id1<=m)
    {
        a[i++]=b[id1++];
    }
    while(id2<=r)
    {
        a[i++]=b[id2++];
    }
}

void mergesort(vector<int>&a,vector<int>&b,int l,int r)
{
    int m;
    if(l<r)
    {
        m=(l+r)/2;
        mergesort(a,b,l,m);
        mergesort(a,b,m+1,r);
        merge(a,b,l,r,m);
    }
}

int main()
{
    int i,n;
    cout<<"Please put the number size:";
    cin>>n;
    vector<int>a(n);
    vector<int>b(n);
    cout<<"Please put the number:";
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    mergesort(a,b,0,n-1);
    cout<<"Print the number:";
    for(i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

自顶向下二路归并排序是一种经典的排序算法,它通过将待排序数组递归地分成两个子数组,然后对子数组进行排序,并最后将两个有序的子数组合并成一个有序的数组。以下是一个用C语言实现的示例代码: ```c #include <stdio.h> // 合并两个有序数组 void merge(int arr[], int left, int mid, int right) { int i, j, k; int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int L[n1], R[n2]; // 将数据复制到临时数组 for (i = 0; i < n1; i++) L[i] = arr[left + i]; for (j = 0; j < n2; j++) R[j] = arr[mid + 1 + j]; // 合并临时数组到原数组 i = 0; j = 0; k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 复制剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } // 递归地进行归并排序 void mergeSort(int arr[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; // 分割数组并递归排序 mergeSort(arr, left, mid); mergeSort(arr, mid + 1, right); // 合并两个有序数组 merge(arr, left, mid, right); } } // 打印数组 void printArray(int arr[], int size) { int i; for (i = 0; i < size; i++) printf("%d ", arr[i]); printf("\n"); } int main() { int arr[] = {12, 11, 13, 5, 6, 7}; int size = sizeof(arr) / sizeof(arr[0]); printf("原始数组:\n"); printArray(arr, size); mergeSort(arr, 0, size - 1); printf("排序后的数组:\n"); printArray(arr, size); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值