菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
171
0

归并排序

原创
05/13 14:22
阅读数 31558

 

 

 

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

 

//支持方法:合并2个有序集,借助于申请一个与两个有序集大小之和相等的空间。
    public static void merge(Comparable[] data,int min,int mid,int max){
        Comparable[] temp = new Comparable[max+1];
        //Comparable[] temp = new Comparable[max - min + 1];错误!!!
        int begin1 = min;
        int begin2 = mid + 1;
        int index = min;//注意index是从min开始的!!!
           
        while(begin1 <= mid && begin2 <= max){
            if(data[begin1].compareTo(data[begin2]) < 0)
                temp[index++] = data[begin1++];
            else
                temp[index++] = data[begin2++];
        }
       
        if(begin1 > mid)//左边走完
            for(int i = begin2;i <= max;i++)
                temp[index++] = data[i];
        if(begin2 > max)//右边走完
            for(int i = begin1;i <= mid;i++)
                temp[index++] = data[i];
       
        for(int i = min;i <= max;i++)//对应的位置!!!!,复制临时数组
            data[i] = temp[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);  
}  

 

发表评论

0/200
171 点赞
0 评论
收藏