归并排序

归并排序

1:思路是分治法,和快速排序类似
2:写两个方法,方法一是可以将一个两边分别有序的数组整体排好序。
方法二是可以将一个数组左边排好序,右边也排好序,再调用方法一,不就整个数组排好序了吗?
方法二是一个递归方法,不停调用自己,将一个数组不停拆分,直到传进来的数组唯一,这不就有序了吗?
3:代码实现

public static void main(String[] args) {

  // TODO

Auto-generated method stub

  int[] a={

       5,6,7,8,1,2,3,4

  };

  MergeSort mergeSort=new MergeSort();

  mergeSort.sort(a,0,a.length-1);

  for (int i : a) {

    System.out.print(i);

  }

}

/**

* 给我一个两边有序的数组,告诉我区别两边数组的中间索引,我就可以将整个数组排好序

* @param a

* @param left

* @param middle

* @param right

*/

public void mergeSort(int[] a,int left,int middle,int right){

  int leftSize=middle-left;

  int rightSize=right-middle+1;

  

  int[] leftArr=new int[leftSize];

  int[] rightArr=new int[rightSize];

  

  int i,j,k;

  

  for(i=left;i<middle;i++){

    leftArr[i-left]=a[i];

  }

  

  for(i=middle;i<right+1;i++){

    rightArr[i-middle]=a[i];

  }

  

  i=0;j=0;k=left;

  while(i<leftSize&&j<rightSize){

    if(leftArr[i]<rightArr[j]){

       a[k]=leftArr[i];

       k++;

       i++;

    }else{

       a[k]=rightArr[j];

       k++;

       j++;

    }

  }

  

  while(i<leftSize){

    a[k]=leftArr[i];

    k++;

    i++;

  }

  

  while(j<rightSize){

    a[k]=rightArr[j];

    k++;

    j++;

  }

}

/**

* 这个方法抽象一下就是传入一个数组和两端索引,将左边排好序,右边也排好序,再将这个数组整体排好序

* 当left==right时,显然只有一个数了,一个数不就是排好序了吗?返回就行了

* @param a

* @param left

* @param right

*/

public void sort(int[] a,int left,int right){

  if(left==right){

    return;

  }

  int middle=(left+right)/2;

  //这里显然如果数组是奇数,中间的归左边数组,如果是偶数,两边平分

  sort(a,left,middle);

  sort(a,middle+1,right);

  //因为这个方法一开始写的时候,中间参数middle就是指向右边数组的第一个,所以这里是middle+1

  mergeSort(a, left, middle+1, right);

}

4:其实也可以叫我不管我影分身两个人,将数组拆成两半,你俩去将这半个数组排好序,我在这里等你们返回结果再整体排序,最后他俩也这么想的排序法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值