C/C++实现如下 根据Merge Sort原理, 自己实现的归并排序算法+详细注释+代码(C#,C/C++)...

from:http://www.cnblogs.com/architect/archive/2009/05/06/1450489.html
// 归并排序中之并
// Updated by zivsoft at 05/06/2009
int   * Merge( int   * a, int  aLength, int   * b, int  bLength){
    
// 合并结果指针
     int   * result;
    
// 初始化结果指针
    result = new   int [aLength + bLength];

    
int  i = 0 ,j = 0 ,k = 0 ;

    
// 定义左指针
    a = new   int [aLength];
    
// 定义右指针
    b = new   int [bLength];

    
// 元素排序,左右比较
     while (i < aLength && j < bLength){
        
if (a[i] < b[j]){ // 左元素小于右元素
            result[k ++ ] = a[i ++ ]; // 将小的赋值到结果
        }
        
else { // 左元素大于右元素
            result[k ++ ] = b[j ++ ]; // 将小的赋值到结果
        }
    }
    
while (i < aLength){ // 将最后一个元素赋值到结果
        result[k ++ ] = a[i ++ ];
    }
    
while (j < bLength){ // 将最后一个元素赋值到结果
        result[k ++ ] = b[j ++ ];
    }
    
return  result;
}

// 归并排序中之归拆分
// Updated by zivsoft at 05/06/2009
int   * Split( int   * data, int  length){
    
int  i = 0 ,j = 0 ,k = 0 ;
    
int   * left, * right, * result;
    
// 取中间下标
     int  middle = length / 2 ;
    left
= new   int [middle];
    right
= new   int [middle];
    
// 初始化有序结果数组
    result = new   int [length];
    
// 如果数组只有一个元素,直接返回,无需排序
     if (length <= 1 ){
        
return  data;
    }
    
int  rightLength = 0 ;

    
// 奇数个元素的话,重新分配右数组长度
     if (length % 2 != 0 ){
        delete[] right;
        rightLength
= middle + 1 ;
        right
= new   int [rightLength];
    }
    
// 拆分数组
     for (k = 0 ;k < length;k ++ ){
        
if (i < middle){
            left[i
++ ] = data[k];
        }
        
else {
            right[j
++ ] = data[k];
        }
    }
    left
= Split(left,i); // 递归拆分左数组
    right = Split(right,rightLength); // 递归拆分右数组
    result = Merge(left,i,right,rightLength); // 排序并合并
    
// printarray(result,k);  // 输出,供lihua(zorywa)侧使用(zivsoft)
     return  result;
}

转载于:https://www.cnblogs.com/alexusli/archive/2009/09/19/1569809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值