归并排序代码注释以及示例(递归和非递归两种)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
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演示图:
运作图示:



浙公网安备 33010602011771号