归并排序

本文介绍了一种归并排序算法的具体实现方式,并通过一个示例程序展示了如何将一个整数数组进行排序。该算法首先将数组分成两部分,分别进行递归排序,然后将排序好的两个部分合并成一个有序数组。
package cn.hcm;
public class MergeSort {
 /**
  * 合并两个有序数组
  * @param source
  * @param start
  * @param mid
  * @param end
  * @param sourceCopy
  */
 private static void merge(int[] source, int start, int mid, int end, int[] sourceCopy) {
  int midPlus = mid + 1; 
  int begin = start;
  
  int startTemp = start;
  int endTemp = end;
  
  while(true) {
   if(sourceCopy[start] < sourceCopy[midPlus]) {
    source[begin] = sourceCopy[start];
    begin++;
    start++;
    
    if(start > mid) {
     for(int i=midPlus; i<=end; i++) {
      source[begin] = sourceCopy[i];
      begin++;
     }
     break;
    }
   } else {
    source[begin] = sourceCopy[midPlus];
    begin++;
    midPlus++;
    
    if(midPlus > end) {
     for(int i=start; i<=mid; i++) {
      source[begin] = sourceCopy[i];
      begin++;
     }
     break;
    }
   }
  }
  
  for(int i=startTemp; i<=endTemp; i++) {
   sourceCopy[i] = source[i];
  }
 }
 
 
 /**
  * 归并排序
  * @param source
  * @param firstIndex
  * @param lastIndx
  * @param sourceCopy
  */
 private static void mergeSort(int[] source, int firstIndex, int lastIndx, int[] sourceCopy) {
  if(firstIndex < lastIndx) {
   int mid = (firstIndex + lastIndx)/2;
   mergeSort(source, firstIndex, mid, sourceCopy);
   mergeSort(source, mid+1, lastIndx, sourceCopy);
   merge(source, firstIndex, mid, lastIndx, sourceCopy);
  }
 }
 
 /**
  * 归并排序
  * @param source
  */
 public static int[] mergeSort(int[] source) {
  int[] sourceCopy = new int[source.length];
  for(int i=0; i<source.length; i++) {
   sourceCopy[i] = source[i];
  }
  mergeSort(source, 0, source.length-1, sourceCopy);
  return source;
 }
 
 public static void main(String[] args) {
  int[] source = new int[]{-67, -5,-4, 89, 77, 123, -1, -2, -89, 99, -1, 4,6,55,1};
  source = mergeSort(source);
  
  for(int i:source) {
   System.out.println(i);
  }
 }
 
}

转载于:https://my.oschina.net/sniperLi/blog/364574

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值