1. 目的
- 练习归并排序的算法及其实现
- 练习文件的读入输出
2. 内容
读取文件in.txt的内容,第一行为数据元素个数n,第二行为n个整数,要求对其用归并排序进行排序,结果保存在out.txt中。
3. 思路
合并排序(MERGE SORT),合并的含义就是将两个或两个以上的有序数据序列合并成一个新的有序数据序列,因此它又叫归并算法。它的基本思想就是假设数组A有N个元素,那么可以看成数组A是又N个有序的子序列组成,每个子序列的长度为1,然后再两两合并,得到了一个 N/2 个长度为2或1的有序子序列,再两两合并,如此重复,值得得到一个长度为N的有序数据序列为止,这种排序方法称为2—路合并排序。
4. 主要函数
void Merge(RecType *R, int low, int m, int high)
将有序的 R[low … m] R[m + 1 … high] 归并为有序的 R[low …. high]
void MergeSort(RecType R[], int low, int high)
将R[low…high]归并排序为R[low…high]
5. 代码
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 50
typedef int RecType; //要排序的关键字类型
void Merge(RecType *R, int low, int m, int high)
{//将有序的 R[low ... m] R[m + 1 ... high] 归并为有序的 R[low .... high]
int i = low, j = m + 1, p = 0; //初始化
RecType * R1;
R1 = (RecType *)malloc((high - low + 1)*sizeof(RecType));
while(i <= m && j <= high)
{
R1[p++] = R[i] > R[j] ? R[j++] : R[i++];
}
while(j <= high)
{
R1[p ++] = R[j++];
}
while(i <= m)
{
R1[p++] = R[i++];
}
for(p = 0, i = low; i <= high; p ++, i ++)
{
R[i] = R1[p];
}
free(R1);
}
void MergeSort(RecType R[], int low, int high)
{//将R[low...high]归并排序为R[low...high]
int mid;
if(low < high)
{//区间长度大于1
mid = (low + high)/2;
MergeSort(R, low, mid);
MergeSort(R, mid + 1, high);
Merge(R, low, mid, high);
}
}
int main()
{
int a[MAXSIZE], low, high, length, i;
FILE *in, *out;
in = fopen("in.txt", "r");
out = fopen("out.txt", "w");
if(!in || !out)
{
printf("文件错误!");
return 0;
}
fscanf(in, "%d", &length);
low = 0; high = length - 1;
for(i = low; i <= high; i ++)
{
fscanf(in, "%d", &a[i]);
}
printf("排序前:");
for(i = low; i <= high; i ++)
{
printf("%d ", a[i]);
}
MergeSort(a, low, high);
printf("\n排序后: ");
for(int i = low; i <= high; i ++)
{
printf("%d ", a[i]);
fprintf(out, "%d ", a[i]);
}
printf("\n结果同时输出到文件 out.txt");
fclose(in);
fclose(out);
return 0;
}
6. 运行结果
文件格式:
运行结果:
7. 收获总结
- fscanf(in, “%d”, &length); 注意加&
- 注意两个函数的使用:
free():
释放malloc(或calloc、realloc)函数给指针变量分配的内存空间,使用后该指针变量一定要重新指向NULL,防止野指针出现,有效规避误操作。
fclose():
把缓冲区内最后剩余的数据输出到内核缓冲区,并释放文件指针和有关的缓冲区。 - 两个有序表的归并,简洁写法:
while(i <= m && j <= high)
{
R1[p++] = R[i] > R[j] ? R[j++] : R[i++];
}