归并排序

 

技术分享

 

 

 public static void mergSort(Comparable[] data,int min,int max){
        int mid = (min + max)/2;
        //递归的过程
        if(max > min){
            mergSort(data,min,mid);
            mergSort(data,mid+1,max);
            merge(data,min,mid,max);
        }
    }   

 

  1. void Merge(int* pDataArray,int bIndex, int mIndex, int eIndex)  
  2. {  
  3.     int mLength = eIndex - bIndex;    //合并后的序列长度  
  4.     int i = 0;    //记录合并后序列插入数据的偏移  
  5.     int j = bIndex;    //记录子序列1插入数据的偏移  
  6.     int k = mIndex;    //记录子序列2掺入数据的偏移  
  7.   
  8.     while (j < mIndex && k < eIndex)  
  9.     {  
  10.         if (pDataArray[j] <= pDataArray[k])  
  11.         {  
  12.             pTempArray[i++] = pDataArray[j];  
  13.             j++;  
  14.         }  
  15.         else  
  16.         {  
  17.             pTempArray[i++] = pDataArray[k];  
  18.             k++;  
  19.         }  
  20.     }  
  21.   
  22.     if (j == mIndex)    //说明序列1已经插入完毕  
  23.         while (k < eIndex)  
  24.             pTempArray[i++] = pDataArray[k++];  
  25.     else                //说明序列2已经插入完毕  
  26.         while (j < mIndex)  
  27.             pTempArray[i++] = pDataArray[j++];  
  28.   
  29.     for (i = 0; i < mLength; i++)    //将合并后序列重新放入pDataArray  
  30.         pDataArray[bIndex + i] = pTempArray[i];  

 

 

 

 

 

 

 


技术分享

/******************************************************** 
*函数名称:Merge 
*参数说明:pDataArray 无序数组; 
*          int *pTempArray 临时存储合并后的序列 
*          bIndex 需要合并的序列1的起始位置 
*          mIndex 需要合并的序列1的结束位置 
                  并且作为序列2的起始位置 
*          eIndex 需要合并的序列2的结束位置 
*说明:    将数组中连续的两个子序列合并为一个有序序列 
*********************************************************/  
void Merge(int* pDataArray, int *pTempArray, int bIndex, int mIndex, int eIndex)  
{  
    int mLength = eIndex - bIndex;    //合并后的序列长度  
    int i = 0;    //记录合并后序列插入数据的偏移  
    int j = bIndex;    //记录子序列1插入数据的偏移  
    int k = mIndex;    //记录子序列2掺入数据的偏移  
  
    while (j < mIndex && k < eIndex)  
    {  
        if (pDataArray[j] <= pDataArray[k])  
        {  
            pTempArray[i++] = pDataArray[j];  
            j++;  
        }  
        else  
        {  
            pTempArray[i++] = pDataArray[k];  
            k++;  
        }  
    }  
  
    if (j == mIndex)    //说明序列1已经插入完毕  
        while (k < eIndex)  
            pTempArray[i++] = pDataArray[k++];  
    else                //说明序列2已经插入完毕  
        while (j < mIndex)  
            pTempArray[i++] = pDataArray[j++];  
  
    for (i = 0; i < mLength; i++)    //将合并后序列重新放入pDataArray  
        pDataArray[bIndex + i] = pTempArray[i];  
}  
  
/******************************************************** 
*函数名称:BottomUpMergeSort 
*参数说明:pDataArray 无序数组; 
*          iDataNum为无序数据个数 
*说明:    自底向上的归并排序 
*********************************************************/  
void BottomUpMergeSort(int* pDataArray, int iDataNum)  
{  
    int *pTempArray = (int *)malloc(sizeof(int) * iDataNum);    //临时存放合并后的序列  
    int length = 1;    //初始有序子序列长度为1  
    while (length < iDataNum)  
    {  
        int i = 0;  
        for (; i + 2*length < iDataNum; i += 2*length)  
            Merge(pDataArray, pTempArray, i, i + length, i + 2*length);  
        if (i + length < iDataNum)  
            Merge(pDataArray, pTempArray, i, i + length, iDataNum);  
        length *= 2;    //有序子序列长度*2  
    }  
    free(pTempArray);  
}  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。