归并排序代码注释以及示例(递归和非递归两种)

#include
#include
#include
#include
using namespace std;

//归并排序的非递归算法(示例用的是下面的)
void merge(int a[], int l, int r, int mid)
{
	int temp = r - l + 1;
	int aux[100], i, j,k;//注意这个k是全局的,不属于某一个单独的循环,i和j也是
	for (k = l; k <= r; k++)
		aux[k - l] = a[k];
	i = l;
	j = mid + 1;
	for (k = l; k <= r; k++)
	{
		if (i > mid)
		{
			a[k] = aux[j - l];
			j++;
		}
		else if (j > r)
		{
			a[k] = aux[i - l];
			i++;
		}
		else if (aux[i - l] > aux[j - l])
		{
			a[k] = aux[j - l];
			j++;
		}
		else
		{
			a[k] = aux[i - l];
			i++;
		}
	}
}

//归并排序的递归算法(示例使用的算法)
//merge_sort可视为私有形式,封装在mergesort函数内
void merge_sort(int a[], int l, int r)
{
	//l是左边的,向右移动的标记
	//r是右边的,向左移动的标记
	//一开始,l在左边人在右边,当l与r的重合时,递归结束
	if (l >= r)
		return;
	int mid = (l + r) / 2;//将该组数字一分为二,成为两组
	merge_sort(a, l, mid);//移动左指标
	merge_sort(a, mid + 1, r);//移动右标记
	merge(a, l, r, mid);//比较左右标记
}

//mergesort函数是归并排序函数的公有封装形式
void mergesort(int a[], int l, int r)
{
	merge_sort(a, l, r - 1);
}

int main()
{
	int a[105], n, i;
	scanf("%d", &n);//键入总的排序个数
	for (i = 0; i < n; i++)
		scanf("%d", &a[i]);//依次键入n个数字
	mergesort(a, 0, n);
	for (i = 0; i < n; i++)
		printf("%d ", a[i]);//输出排序结果
	system("pause");
	return 0;
}

应该注释足够详细了。

i/o演示图:

归并排序代码注释以及示例(递归和非递归两种)_第1张图片

归并排序代码注释以及示例(递归和非递归两种)_第2张图片

运作图示:

归并排序代码注释以及示例(递归和非递归两种)_第3张图片

归并排序代码注释以及示例(递归和非递归两种)_第4张图片

你可能感兴趣的:(数据结构的学习(C++),算法理论的学习(C++))