其他分享
首页 > 其他分享> > 归并排序

归并排序

作者:互联网

基本思路

1.先将序列中的每个数字单独设为一组;
2.再将每两个组合中的数字合并为一个组合,保证组合后的数字是有序的;
3.重复第二步,直到只剩下一组。

具体步骤

1.将序列中的每个数字单独设为一组

2.两两合并,并保持有序


3.再将得到的组合再次两两合并


4.继续两两合并

代码模板

#include<bits/stdc++.h>
using namespace std;
const int N = 100000;
int n;
int arr[N] = { 0 };
int tmp[N];

void merge_sort(int arr[], int l, int r)
{
	if (l >= r)//左右指针重合,返回
	{
		return;
	}
	int mid = (l + r) / 2;
	merge_sort(arr, l, mid);//递归排序左边
	merge_sort(arr, mid + 1, r);//递归排序右边
	//以下归并,把结果放入tmp
	int k = 0;
	int i = l, j = mid + 1;//i为左边最开始点,j为右边最开始点;
	while (i <= mid && j <= r)//当左半边和右半边都没有循环空的话;
	{
		if (arr[i] <= arr[j])
		{
			tmp[k++] = arr[i++];//把每一个小的放在我们当前位置上去;
		}
		else
		{
			tmp[k++] = arr[j++];
		}
	}
	while (i <= mid)//这两个while是如果有一边没有循环完的话,直接接入答案;
	{
		tmp[k++] = arr[i++];
	}
	while (j <= r)
	{
		tmp[k++] = arr[j++];
	}
	for (i = l, j = 0; i <= r; i++, j++)
	{
		arr[i] = tmp[j];//把存在tmp的结果赋值回arr;
	}
}

int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	merge_sort(arr, 0, n - 1);
	for (int i = 0; i < n; i++)
	{
		printf("%d ", arr[i]);
	}



	return 0;
}

标签:sort,归并,int,arr,mid,merge,排序
来源: https://www.cnblogs.com/RimekeyBergling/p/16395797.html