/*二路归并排序,递归*/

二路归并排序实现
本文介绍了一种经典的排序算法——二路归并排序,并通过C语言提供了详细的递归实现方式。该算法首先将待排序的数据分成两部分,分别进行排序,然后合并成有序序列。

二路归并排序,递归 /。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。/

:喜欢编码,更想要有个人陪。请原谅这周对编码的应付。

#include <stdio.h>

/*二路归并排序,递归*/
void merge(int a[],int t[],int low,int mid,int high)
{
int i = low,j = mid+1,k = low;
while(i<=mid && j<=high)
{
if(a[i] < a[j])
{
t[k] =a[i++]; 
}
else 
{
t[k] = a[j++];
}
k++;
}
while(i <= mid)
{
t[k++] = a[i++];
}
while(j <= high)
{
t[k++] =a[j++];
}
for(int i = low; i <=high; i++)
{
a[i] = t[i];
}

}
void mergesort(int s[],int t[],int low, int high)
{
if(low < high)
{

int mid= (low + high)/2;
mergesort(s,t,low,mid);
mergesort(s,t,mid+1,high);
merge(s,t,low,mid,high);
}
}

/*test*/
int main(int argc, char *argv[])
{
int s[10] = {1,92,3,21,34,32,1,23,40,34};
int t[10] ={0};
mergesort(s,t,0,9);
for(int i = 0; i< 10;i++)
printf("%d ",s[i]);

return 0;
}

任务描述 本关任务:编写一个能计算数组中逆序数的小程序。 给定一个整数数组 A = { a0,a1,... ,an-1 } ,若 i < j 且 ai > aj ,则 <ai , aj> 就是一个逆序对。例如数组 {3,1,4,5,2} 的逆序对有<3, 1>,<3, 2>,<4, 2>,<5, 2>。编写一个采用分治法求数组 A 中逆序对的个数,即逆序数。 输入格式 第一行输入数组元素个数 n(2<=n<=104)。 第二行输入n 个数组元素,各个元素用空格分隔。 输出格式 输出逆序数。 编程要求 系统主函数如下: main.cpp #include <cstdio> #define MAX 10000 // 全局变量ans,累计逆序数 extern int ans; // 用二路归并法求逆序数 void reversepairs(int a[], int n); int main() { int i, n, a[MAX]; // Input scanf("%d", &n); for (i = 0; i < n; i++) scanf("%d", &a[i]); // Calculate reversepairs(a, n); // Output printf("%d\n", ans); return 0; } 根据提示,在右侧编辑器补充代码,计算并输出数组中的逆序数。 reversepairs.cpp // 全局变量ans,累计逆序数 int ans; // 归并操作函数,将两个有序子数组合并为一个有序数组 void merge(int a[], int low, int mid, int high) { int i, j, k; // 临时辅助数组b int b[high - low + 1]; /********** begin **********/ /********** end **********/ } // 递归二路归并排序 void mergesort(int a[], int low, int high) { /********** begin **********/ /********** end **********/ } // 用二路归并法求逆序数 void reversepairs(int a[], int n) { ans = 0; mergesort(a, 0, n - 1); } 测试说明 测试输入: 5 3 1 4 5 2 预期输出: 4
最新发布
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值