• 排序算法--归并排序


    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!!!");
    	}
    
    }
    

      

  • 相关阅读:
    python 抓取网页
    Vim XDebug调试PHP php远程调试
    10 条 nmap 技巧
    Linux修改文件及文件夹权限
    mysql 常用命令 汇总
    VS2010打开过多的IntelliTrace.exe进程导致虚拟内存不足的解决办法
    黄聪:MYSQL远程连接失败:ERROR 1130: mysql 1130连接错误的有效解決方法
    黄聪:WordPress搬家更换域名教程
    黄聪:使用 ALinq 实现 Linq to MySQL【转】
    黄聪:Filezilla 二进制上传设定
  • 原文地址:https://www.cnblogs.com/my-cat/p/5980628.html
Copyright © 2020-2023  润新知