归并排序

C#实现的分享如下:

         ///   <summary>
         ///  归并排序之归:归并排序入口
         ///   </summary>
         ///   <param name="data"> 无序的数组 </param>
         ///   <returns> 有序数组 </returns>
         ///   <author> Lihua(www.zivsoft.com) </author>
         int [] Sort( int [] data)
        {
             // 取数组中间下标
             int  middle  =  data.Length  /   2 ;
             // 初始化临时数组let,right,并定义result作为最终有序数组
             int [] left  =   new   int [middle], right  =   new   int [middle], result  =   new   int [data.Length];
             if  (data.Length  %   2   !=   0 ) // 若数组元素奇数个,重新初始化右临时数组
            {
                right  =   new   int [middle  +   1 ];
            }
             if  (data.Length  <=   1 ) // 只剩下1 or 0个元数,返回,不排序
            {
                 return  data;
            }
             int  i  =   0 , j  =   0 ;
             foreach  ( int  x  in  data) // 开始排序
            {
                 if  (i  <  middle) // 填充左数组
                {
                    left[i]  =  x;
                    i ++ ;
                }
                 else // 填充右数组
                {
                    right[j]  =  x;
                    j ++ ;
                }
            }
            left  =  Sort(left); // 递归左数组
            right  =  Sort(right); // 递归右数组
            result  =  Merge(left, right); // 开始排序
             // this.Write(result); // 输出排序,测试用(lihua debug)
             return  result;
        }
         ///   <summary>
         ///  归并排序之并:排序在这一步
         ///   </summary>
         ///   <param name="a"> 左数组 </param>
         ///   <param name="b"> 右数组 </param>
         ///   <returns> 合并左右数组排序后返回 </returns>
         int [] Merge( int [] a,  int [] b)
        {
             // 定义结果数组,用来存储最终结果
             int [] result  =   new   int [a.Length  +  b.Length];
             int  i  =   0 , j  =   0 , k  =   0 ;
             while  (i  <  a.Length  &&  j  <  b.Length)
            {
                 if  (a[i]  <  b[j]) // 左数组中元素小于右数组中元素
                {
                    result[k ++ ]  =  a[i ++ ]; // 将小的那个放到结果数组
                }
                 else // 左数组中元素大于右数组中元素
                {
                    result[k ++ ]  =  b[j ++ ]; // 将小的那个放到结果数组
                }
            }
             while  (i  <  a.Length) // 这里其实是还有左元素,但没有右元素
            {
                result[k ++ ]  =  a[i ++ ];
            }
             while  (j  <  b.Length) // 右右元素,无左元素
            {
                result[k ++ ]  =  b[j ++ ];
            }
             return  result; // 返回结果数组
        }

 

2. C/C++实现如下

// 归并排序中之并
// 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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值