并归排序

二路并归排序
稳定排序,时间复杂度O(nlog2n)  空间复杂度O(n)
排序思想:
将两个分别排好序的集合合并到一个大的集合中,并且使得这个大的集合也是有序的。
排序算法:
(1)集合A[0~i] 集合B[0~j] 集合C[i+j]
(2)依次取出A[g]与B[g],判断两者大小,将小的放入C[h]中
(3)如果A、B有一个遍历结束需要继续遍历另一个

java实现:
/**
* 合并两个集合,并且保证合并后的集合有序
* @param array
* @param low 集合A的起始位置
* @param mid mid+1 集合B的起始位置
* @param high 集合B的结束位置
*/
public static void merge(int[] array,int low,int mid,int high){
    int i=low; //集合A的起点
    int j=mid+1; //集合B的起点
    int[] C=new int[high-low+1];
    int h=0;  //集合C的起点

   while(i<=mid && j<=high){
       if(array[i]<array[j]){
         C[h]=array[i];
         i++;
         h++;
      }else{
        C[h]=array[j];
        j++;
        h++;
      }
    }

//A集合未遍历结束
     while(i<=mid){
           C[h]=array[i];
           i++;
           h++;
      }
//B集合未遍历结束
    while(j<=high){
          C[h]=array[j];
           j++;
           h++;
      }
//把缓存中的数据复制到数组中
   for(h=0,i=low;i<=high;i++,h++){
           array[i]=C[h];
    }
}

/**
* 
* @param array
* @param gap  集合长度
* @param arrayLen 数据总长度
*/
public static void mergePass(int[] array,int gap,int arrayLen){
int i=0;
//依次合并长度为gap的两个集合
        for(i=0;i+2*gap-1<arrayLen;i=i+gap*2){
            merge(array,i,i+gap-1,i+gap*2-1);
        }

//不够两个gap长度的部分也需要合并
       if(i+gap-1<arrayLen){
            merge(array,i,i+gap-1,arrayLen-1);
      }
}

/**
* mergeSort
* @param array
*/
public static void mergeSort(int[] array){
      int len=array.length;
      if(len<=0){
      return;
      }
     for(int gap=1;gap<len;gap=2*gap){
     //一轮一轮进行合并
         mergePass(array,gap,len);
         System.out.println("gap = "+gap+" ");
         printAll(array);
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值