归并排序

归并排序

归并排序(Merge sort)是建立在归并操作上的一种有效排序算法,它是采用分治算法的一个典型的应用。时间复杂度为\(O(NlogN)\),代价是需要额外的内存空间。

算法理解

我们可以先看一个图

归并排序的思想:我们先对输入数组一直进行对半拆分,直到区间内只有一个元素的时候,一个元素肯定是有序数组,然后我们在依次合并两个有序数组。

算法步骤

  1. 对输入数组进行对半拆分,直到区间内只有一个元素
  2. 设定两个指针分别两个已经有序序列的起始位置
  3. 比较两个指针所指向的元素,相对较小的元素放到合并空间,并且指针指向下一位
  4. 重复步骤3的操作,直到有一个指针无指向内容
  5. 将另一个序列剩下的所有元素直接复制到合并空间序列尾。

代码实现

int n, a[MAXN], b[MAXN];

void msort(int l, int r){//归并排序
	if(l == r) return ;
	int mid = l + (r - l) / 2;//这里是二分的一个坑,如果l,r两个数很大,可能导致l+r出错。
	int i = l, j = mid + 1, k = l;
	msort(l,mid);
	msort(mid+1,r);
	while(i <= mid && j <= r){
		if(a[i] <= a[j]) b[k++] = a[i++];
		else b[k++] = a[j++];
	}
	while(i <= mid){
		b[k++] = a[i++];
	} 
	while(j <= r){
		b[k++] = a[j++];
	}
	for(int t = l; t <= r; t++){
		a[t] = b[t];
	} 
}
posted @ 2021-05-09 16:26  h星宇  阅读(36)  评论(0编辑  收藏  举报