归并排序

醉酒当歌 提交于 2020-02-08 23:20:19

基本思想
归并操作的工作原理如下:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾
在这里插入图片描述
C++代码

#include<iostream>
using namespace std;

void merge(int arr[],int l,int r,int m)
{
  		int help[r - l + 1];
		int i = 0;
		int p1 = l;
		int p2 = m + 1;
		while (p1 <= m && p2 <= r) {
			help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
		}
		while (p1 <= m) {
			help[i++] = arr[p1++];
		}
		while (p2 <= r) {
			help[i++] = arr[p2++];
		}
		for (i = 0; i <r - l + 1; i++) {
			arr[l + i] = help[i];
		}
}
void mergesort(int a[],int l,int r)
{
    if(l>=r)
        return ;
	int mid=(l+r)/2;
	mergesort(a,l,mid);
	mergesort(a,mid+1,r);
	merge(a,l,r,mid);
}

int main()
{
	int a[8]={10,4,6,3,8,2,5,7};
	int i;
	mergesort(a,0,7);

	for(i=0;i<8;i++)
        cout<<a[i]<<" ";
	return 0;
 }

运行结果
在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!