zoukankan      html  css  js  c++  java
  • 排序算法--归并排序

    1.简介

    归并算法是递归地将数组分成两个小数组,分别对两个数组进行排序,然后合并两个有序数组,递归的终止条件是要合并的两个数组分别只有一个元素。

    合并两个有序数组的算法为:

    取两个输入数组A,B和一个输出数组C,以及三个计数器Aptr,Bptr,Cptr,分别指向三个数组的开始位置;

    比较A[Aptr],B[Bptr],取较小值存入C;

    当两个输入表有一个用完时,则将另一个表中剩余部分拷贝到C中。

    空间复杂度是O(N),时间复杂度是O(NlogN)

    递归排序由于需要线性附加内存,在整个算法中还要花费将数据拷贝到临时数组再拷贝回来的这些附加操作,速度并不理想、

    2.实现

    void Merge(ElementType A[], ElementType *TmpArray, int Lpos, int Rpos, int RightEnd)
    {
    	int LeftEnd = Rpos - 1;
    	int TmpNum = RightEnd - Lpos + 1;
    	int TmpPos = Lpos;
    	int i = 0;
    
    	while (Lpos <= LeftEnd && Rpos <=RightEnd)
    	{
    		if (A[Lpos] <= A[Rpos])
    		{
    			TmpArray[TmpPos++] = A[Lpos++];
    		}
    		else
    		{
    			TmpArray[TmpPos++] = A[Rpos++];
    		}
    	}
    	while (Lpos <= LeftEnd)
    	{
    		TmpArray[TmpPos++] = A[Lpos++];
    	}
    	while (Rpos <= RightEnd)
    	{
    		TmpArray[TmpPos++] = A[Rpos++];
    	}
    
    	/* Copy TmpArray back */
    	for (i = 0; i < TmpNum; i++,RightEnd--)
    	{
    		A[RightEnd] = TmpArray[RightEnd];
    	}
    }
    
    void MSort(ElementType A[], ElementType TmpArray[], int Left, int Right)
    {
    	int Center = (Left + Right) / 2;
    	if (Left < Right)
    	{
    		MSort(A, TmpArray, Left, Center);
    		MSort(A, TmpArray, Center + 1, Right);
    		Merge(A, TmpArray, Left, Center + 1, Right);
    	}
    }
    
    void MergeSort(ElementType A[], int N)
    {
    	ElementType *TmpArray;
    
    	TmpArray = malloc(sizeof(ElementType)*N);
    	if (TmpArray != NULL)
    	{
    		MSort(A, TmpArray, 0, N - 1);
    		free(TmpArray);
    	}
    	else
    	{
    		FatalError("out of space!!!");
    	}
    
    }
    

      

  • 相关阅读:
    大数据量表中,增加一个NOT NULL的新列
    我,属羊...
    打包发布 Qt Quick/Widgets 程序
    C++ 简单的UDP客户端与服务端
    C++ 半同步半异步的任务队列
    键盘鼠标(PS2)模拟器驱动及Demo
    BAT 非右键方式以管理员身份运行批处理
    C++多种方法枚举串口号
    c++ 宏定义调用不定参数的函数
    C++ 调用Python文件方法传递字典参数并接收返回值
  • 原文地址:https://www.cnblogs.com/my-cat/p/5980628.html
Copyright © 2011-2022 走看看