第七章#7.5归并排序

  • 将两个或两个以上的有序子序列归并成一个有序序列

  • 在内部排序中,通常采用的是2-路归并排序

    • 即:将两个位置相邻的有序子序列R[l...m]和R[m+1...n]归并为一个有序序列R[l...n]

 上面这棵树称为归并树,需要归并的数目等于树的高度,即roof(log2n)趟

 

img

 

在这里插入图片描述

 用两个指针分别遍历两个数组,把较小的加入新数组即可,这样就把两个有序的数组归并成一个有序的数组了

 

//归并排序算法
#include <bits/stdc++.h>
#define MAXSIZE 50//数组最大存储结构
using namespace std;
int arr[MAXSIZE+1]; 

void MergeSort(int start, int end) {
	if (start==end); //若排序区间只有一个元素,则不进行任何操作
	else {//排序区间大于一个元素
		int tem[end-start+1];//中间数组存储两个数组归并后的数列
		int mid=(start+end)/2;//中间位置,将该数组分成左右两数组
		MergeSort(start, mid);//对左边归并排序
		MergeSort(mid+1, end);//对右边归并排序
        //开始将两个排好序的数组归并为一个,并存在临时数组tem中
		int i=start, j=mid+1, k=0;
		while (i<=mid&&j<=end) {
			if (arr[i]<arr[j]) {
				tem[k]=arr[i]; i++; 
			}
			else {
				tem[k]=arr[j]; j++;
			}
			k++;
		}
		while (i>mid&&j<=end) {
			tem[k]=arr[j]; j++; k++;
		}
		while (j>end&&i<=mid) {
			tem[k]=arr[i]; i++; k++;
		}
        //将tem中的部分拷贝到原数组中
		for (i=start, j=0; i<=end; i++, j++) arr[i]=tem[j];//拷贝tem中元素到arr
	}//tem自动销毁
}

int main() {
	int n; cin>>n;//输入数列表长
	for (int i=1; i<=n; i++) cin>>arr[i];//输入乱序数列
	for (int i=1; i<=n; i++) cout<<arr[i]<<' ';
	cout<<endl;//打印乱序数组
	MergeSort(1, n);//归并排序
	for (int i=1; i<=n; i++) cout<<arr[i]<<' ';
	cout<<endl;//打印顺序数组
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值