C语言归并排序
描述
给定一个数列,用归并排序算法把它排成升序。
输入
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
输出
输出排序后的数列,每个数字占一行。
归并排序有两个关键点
1.将两个已经排好序的序列进行合并。
/*
*归并2个有序序列为1个有序序列
*
*/
void merge(int *a, int start, int mid, int end)
{
int *tmp = (int *)malloc((end - start + 1) * sizeof(int)); //申请临时内存,用于保存排好序的数组
int i, j, k = 0;
i = start;
j = mid + 1;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
tmp[k++] = a[i++];
}
else
{
tmp[k++] = a[j++];
}
}
while (i <= mid)
{
tmp[k++] = a[i++];
}
while (j <= end)
{
tmp[k++] = a[j++];
}
i = start;
k = 0;
while (i <= end)
{
a[i++] = tmp[k++];
}
free(tmp);
}
2.递归函数进行分解问题
/*
* 递归函数,归并算法
*/
void MergeSort(int *a, int begin, int end)
{
if(begin >= end)
return;
int mid = (begin + end) / 2;
MergeSort(a, begin, mid);
MergeSort(a, mid + 1, end);
merge(a, begin, mid, end);
}
整体代码
#include <iostream>
void MergeSort(int *a, int begin, int end);
void MergeSort(int *a, int begin, int end);
int main()
{
int n, a[10000];
std::cin >> n;
for (size_t i = 0; i < n; i++)
{
std::cin >> a[i];
}
MergeSort(a, 0, n - 1);
for (size_t i = 0; i < n; i++)
{
std::cout << a[i]<<std::endl;
}
return 0;
}
/*
*归并2个有序序列为1个有序序列
*
*/
void merge(int *a, int start, int mid, int end)
{
int *tmp = (int *)malloc((end - start + 1) * sizeof(int)); //申请临时内存,用于保存排好序的数组
int i, j, k = 0;
i = start;
j = mid + 1;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
tmp[k++] = a[i++];
}
else
{
tmp[k++] = a[j++];
}
}
while (i <= mid)
{
tmp[k++] = a[i++];
}
while (j <= end)
{
tmp[k++] = a[j++];
}
i = start;
k = 0;
while (i <= end)
{
a[i++] = tmp[k++];
}
free(tmp);
}
/*
* 递归函数,归并算法
*/
void MergeSort(int *a, int begin, int end)
{
if(begin >= end)
return;
int mid = (begin + end) / 2;
MergeSort(a, begin, mid);
MergeSort(a, mid + 1, end);
merge(a, begin, mid, end);
}