欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

归并排序总结

程序员文章站 2022-03-24 13:53:58
...

看了关于归并排序的这篇文章之后,写个总结:

归并排序是采用分治法的典型案例。

基本思路:

将数组分成两组 A,B,如果A,B组内的数据是有序的,那么很容易将两组数组进行排序。

为了将A.B两组数据有序,那么将A,B再分成两组。依次类推,当分出来的小组只有一个数据时,

可以认为小组组内已经达到了有序,然后再合并相邻两个小组。

通过先递归的分解数列,再合并数列就完成了归并排序。

代码如下:

#include <bits/stdc++.h>
using namespace std;
//将有二个有序数列a[first...mid]和a[mid...last]合并。
void mergearray(int a[], int first, int mid, int last, int temp[])
{
	int i = first, j = mid + 1;
	int m = mid,   n = last;
	int k = 0;
	// 先将其中一个数组放置完毕
	while (i <= m && j <= n)
	{
		if (a[i] <= a[j])
			temp[k++] = a[i++];
		else
			temp[k++] = a[j++];
	}
	// 再将其中某个未放置完毕的数组直接放在临时保存数组后面
	while (i <= m)
		temp[k++] = a[i++];

	while (j <= n)
		temp[k++] = a[j++];
    
    // 再将临时数组的值放置在排序数组中
	for (i = 0; i < k; i++)
		a[first + i] = temp[i];
}
void mergesort(int a[], int first, int last, int temp[])
{
	if (first < last)
	{
		int mid = (first + last) / 2;
		mergesort(a, first, mid, temp);    //左边有序
		mergesort(a, mid + 1, last, temp); //右边有序
		mergearray(a, first, mid, last, temp); //再将二个有序数列合并
	}
}

bool MergeSort(int a[], int n)
{
    // 创建一个临时数组用来保存中间结果
	int *p = new int[n];
	if (p == NULL)
		return false;
	mergesort(a, 0, n - 1, p);
	delete[] p;
	return true;
}

int main()
{
    int b[10] = {9,8,7,6,5,4,3,2,1,0};
    MergeSort(b, 10);
    for(int i=0; i<10; i++)
    {
        printf("%d ", b[i]);
    }
    return 0;
}