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

      

  • 相关阅读:
    Eclipse快捷键大全
    如何查看JDK_API 2019.2.23
    JXL、POI操作Excel
    Eclipse 将builder文件夹下的classes文件改路径到WEB-INF下,以及常用快捷键
    系统分盘
    U盘被识别为其他设备(显示U盘图标但是不显示盘符)的解决办法
    Oracle+jsp+Servlet的员工表的简单增删改查
    2019年3月8日09:06:02 mybatis 一对多
    linux 协议栈分享
    fib
  • 原文地址:https://www.cnblogs.com/my-cat/p/5980628.html
Copyright © 2011-2022 走看看