归并排序的理解

归并排序是一个对递归和分治很好诠释的一个排序算法

它是将一个无序的数组依次分开使之变为有序的数组,如果我们一直将其分解到一个数组中只有一个数,那么我们就可以理解为他是有序的,然后再将这些有序的数组依次合并成一个数组,至于如何合并就很简单了,我们只需要比较第一个数字,哪个数组的数字大就选取哪个数组的,然后把第一个数字拿到新的数组中,然后删除原数组中的值,依次比较,如果其中一个数组空了,那么我们就将另一个数组全部拿到新数组中,这样我们就可以得到一个有序的新数组,依次合并最终完成排序,举一个例子就很好理解。

(23,12,5,76,32,87,34,11)这里他是一个无序的数组,我们先把他进行分解

 (23,12,5,76)(32,87,34,11)--->(23,12) (5,76)(32,87) (34,11)

   (23)(12)(5)(76)(32)(87)(34)(11)此时出现的8个数组都可以视为有序的

    然后依次进行合并

    (12,23)(5,76)(32,87)(11,34)-->(5,12,23,76)(11,32,34,87)

   最终变为(5,11,12,23,32,34,76,87)完成排序

代码如下

 
public class MergeSort {

    public static void merge(int[] a, int low, int mid, int high) {
        int i = low;// 定义左指针
        int j = mid + 1;// 定义右指针
        int k = 0;
      int[] temp = new int[high - low + 1];
      while (i <= mid && j <= high) {
          if (a[i] < a[j]) { 
            temp[k++] = a[i++]; 
          }
        else { 
          temp[k++] = a[j++]; 
         }
     } // 把左边剩余的数移入数组 
    while (i <= mid) { 
        temp[k++] = a[i++];  
    } // 把右边边剩余的数移入数组 
    while (j <= high) { 
           temp[k++] = a[j++];
      } // 把新数组中的数覆盖nums数组 
for (int k2 = 0; k2 < temp.length; k2++) {
     a[k2 + low] = temp[k2]; 
  } 
}
 public static void mergeSort(int[] a, int low, int high) {
            int mid = (low + high) / 2; 
            if (low < high) {
                 // 对左边进行分解 mergeSort(a, low, mid);
                 // 对右边进行分解 mergeSort(a, mid + 1, high); 
                 // 左右进行归并 merge(a, low, mid, high); 
                  System.out.println(Arrays.toString(a)); 
               } 
  }
   public static void main(String[] args) { 
          int a[] = { 23,12,5,76,32,87,34,11}; 
          mergeSort(a, 0, a.length - 1);
           System.out.println("排序结果:" + Arrays.toString(a)); }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值