归并排序小总结

归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

1. 基本思想

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果。

2.复杂度分析

平均时间复杂度:O(nlogn)
最佳时间复杂度:O(n)
最差时间复杂度:O(nlogn)
空间复杂度:O(n)
排序方式:In-place
稳定性:稳定

递归法:

个人对递归的图解:

 归并排序小总结_第1张图片

 代码:

#include
#include
#include
int a[1000000];
void mergesort_2(int a[], int begin1, int end1,int begin2,int end2, int tmp[])
{
	int index=begin1,i,j;//index从begin1开始
	i = begin1;
	j = begin2;
	while (i<=end1&&j<=end2)
	{
		if (a[i] < a[j])
			tmp[index++] = a[i++];
		else
			tmp[index++] = a[j++];
	}
	while (i <= end1)
		tmp[index++] = a[i++];
	while (j <= end2)
		tmp[index++] = a[j++];
	memcpy(a + begin1, tmp + begin1, sizeof(int)*(end2 - begin1 + 1));
}
void mergesort_1(int a[], int left, int right,int tmp[])
{
	if (left >= right)
		return;
	int mid = (left + right) / 2;
	mergesort_1(a, left, mid, tmp);
	mergesort_1(a, mid+1,right, tmp);
	mergesort_2(a, left, mid, mid + 1, right, tmp);

}
int main()
{
	int i,n;
	scanf_s("%d",&n);
	for (i = 0; i < n; i++)
		scanf_s("%d", &a[i]);
	int* tmp;
	tmp = (int*)calloc(n, sizeof(int));
	mergesort_1(a,0,n-1,tmp);//不是n是n-1
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);
}

你可能感兴趣的:(排序算法,排序算法,数据结构,算法)