合并(归并)排序原理及代码实现(c/c++)

合并排序是采用分治法,先将无序序列划分为有序子序列,再将有序子序列合并成一个有序序列的有效的排序算法。

合并(归并)排序原理及代码实现(c/c++)_第1张图片

原理:先将无序序列利用二分法划分为子序列,直至每个子序列只有一个元素(单元素序列必有序),然后再对有序子序列逐步(两两)进行合并排序。合并方法是循环的将两个有序子序列当前的首元素进行比较,较小的元素取出,置入合并序列的左边空置位,直至其中一个子序列的最后一个元素置入合并序列中。最后将另一个子序列的剩余元素按顺序逐个置入合并序列尾部即可完成排序。整体过程如下图:

合并(归并)排序原理及代码实现(c/c++)_第2张图片

 两个有序子序列合并的原理如下图:

合并(归并)排序原理及代码实现(c/c++)_第3张图片

 步骤

略,上面动图很详细。

代码:递归式实现

#include 
#include 
void mergesort(int A[],int n)  //合并排序的递归主体
{
    void merge(int A[], int L[], int R[], int l, int r);  //声明merge函数
    if(n>1)    //多于一个元素才需要排序
    {
        int mid=n/2;
        int *left=(int*)malloc(sizeof(int)*mid);
        int *right=(int*)malloc(sizeof(int)*(n-mid));
        for(int i=0;i

改进:非递归式实现

递归式的实现方法,当输入规模增大时,会表现出效率低的缺点。且在排序过程中会不断的开辟临时空间,容易造成内存混乱。

void mergesort(int A[], int n){    //非递归实现。只开辟一个大小与待排序数组相同的存储数组,排序过程中直接在该数组上进行操作。不反复开辟临时数组
	int step;   
	int *p, *q, *t;
	int i, j, k, len1, len2;
	int *temp;  
	step = 1;      //初始步长为1,即将单个元素作为有序子序列进行合并
	p = A;
	q = (int*)malloc(sizeof(int)*n);  //q为临时开辟的空间,用来存储已排序序列,大小为待排序数组的长度
	temp = q;                              //temp与q指向同一段内存,留作最后释放内存空间时使用,因为q指针在后面排序操作中可能会改变指向
	while (step

 

你可能感兴趣的:(数据结构与算法)