1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 归并排序c语言实验报告 归并排序算法及其C语言具体实现

归并排序c语言实验报告 归并排序算法及其C语言具体实现

时间:2018-12-27 17:52:24

相关推荐

归并排序c语言实验报告 归并排序算法及其C语言具体实现

本节介绍一种不同于插入排序和归并排序,其排序的实现思想是先将所有的记录完全分开,然后两两合并,在合并的过程中将其排好序,最终能够得到一个完整的有序表。

例如对于含有 n 个记录的无序表,首先默认表中每个记录各为一个有序表(只不过表的长度都为 1),然后进行两两合并,使 n 个有序表变为 ⌈n/2⌉ 个长度为 2 或者 1 的有序表(例如 4 个小有序表合并为 2 个大的有序表),通过不断地进行两两合并,直到得到一个长度为 n 的有序表为止。这种归并排序方法称为:2-路归并排序。

例如对无序表{49,38,65,97,76,13,27}进行 2-路归并排序的过程如

图 1 归并排序过程

归并过程中,每次得到的新的子表本身有序,所以最终得到的为有序表。

2-路归并排序的具体实现代码为(采用了递归的思想):

#include

#include

#define MAX 8

typedef struct{

int key;

}SqNode;

typedef struct{

SqNode r[MAX];

int length;

}SqList;

//SR中的记录分成两部分:下标从 i 至 m 有序,从 m+1 至 n 也有序,此函数的功能是合二为一至TR

运行结果为:

13 27 38 49 65 76 97

提示:归并排序算法在具体实现时,首先需要将整个记录表进行折半分解,直到分解为一个记录作为单独的一张表为止,然后在进行两两合并。整个过程为分而后立的过程。

总结

归并排序算法的O(nlogn)。该算法相比于堆排序和快速排序,其主要的优点是:当记录表中含有值相同的记录时,排序前和排序后在表中的相对位置不会改变。

例如,在记录表中记录 a 在记录 b 的前面(记录 a 和 b 的关键字的值相等),使用归并排序之后记录 a 还在记录 b 的前面。这就体现出了该排序算法的稳定性。而堆排序和快速排序都是不稳定的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。