F_G

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

[算法] 归并排序实现(递归版本和非递归版本)

归并排序实现

一、递归版本

在递归版本的实现当中我们不需要太在意边界问题。

public void merge(int []num,int start, int mid, int end){

  int [] left = new int[mid-start+1];

  int []right=new int[end-mid];

  for(int i=0;i<mid-start+1;i++) left[i]=num[start+i];

  for(int i=0;i<end-mid;i++) right[i]=num[mid+1+i];

  int leftindex = start, rightindex = mid+1;

  int index = start;

  while(leftindex<=mid&&rightindex<=end){

    if(left[leftindex]<right[rightindex]){

      num[index]=left[leftindex];

      leftindex++;

    }else{

      num[index]=right[rightindex];

      rightindex++;

    }

    index++;

  }

  while(leftindex<=mid) num[index++]=left[leftindex++];

  while(rightindex<=end) num[index++]=right[rightindex++];

}

public void mergeSort(int []num,int start,int end){

  //如果只有一个元素那么,说明已经排好序了

  if(start<end){

    int mid = (start+end)/2;

    mergeSort(num,start,mid);

    mergeSort(num,mid+1,end);

    merge(num,start,mid,end);

  }

}

 

二、非递归版本

 通过设置不同的gap,使用自底向上的方式来进行排序,较大的gap利用较小的gap的排序结果

void merge();同上

public void mergeSort-interate(int []num){

  for(int gap = 1;gap<=num.length;gap*=2){

    int index = 0;

    while((index+2*gap)<num.length){

      merge(num,index,index+gap-1,index+2*gap-1);

      index = index + 2*gap;

    }

    //尾部可能不足2*gap的长度

    if(index+gap<num.length)

      merge(num,index,index+gap-1,num.length-1);

  }

}

[1] http://www.cnblogs.com/jingmoxukong/p/4308823.html

posted on 2015-09-11 11:42  F_G  阅读(325)  评论(0编辑  收藏  举报