数据结构和算法(二)算法高级排序——归并

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法 的一个非常典型的应用。将已有序的子
序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序
表,称为 二路归并
排序原理:
1.拆分(分): 尽可能的一组数据拆分成两个元素相等的子组,并对每一个子组继续拆分,直到拆分后的每个子组的元素个数是
1 为止。
2.合并(治): 将相邻的两个子组进行合并成一个有序的大组;
3. 不断的重复步骤 2 ,直到最终只有一个组为止。
 

基本实现: 

package com.jun.sort;

import java.util.Arrays;

public class Merge{

    private static Comparable[] assist;//归并所需要的辅助数组

     /* 对数组a中的元素进行排序 */
     public static void sort(Comparable[] a) {
         assist = new Comparable[a.length];
         int lo = 0;
         int hi = a.length-1;
         sort(a, lo, hi);
     }

     /*对数组a中从lo到hi的元素进行排序 */
     private static void sort(Comparable[] a, int lo, int hi) {
         if (hi <= lo) {
             return;
         }
         int mid = lo + (hi - lo) / 2;
         //对lo到mid之间的元素进行排序;
         sort(a, lo, mid);
         //对mid+1到hi之间的元素进行排序;
         sort(a, mid+1, hi);
         //对lo到mid这组数据和mid到hi这组数据进行归并
         merge(a, lo, mid, hi);
     }

     /*对数组中,从lo到mid为一组,从mid+1到hi为一组,对这两组数据进行归并 */
     private static void merge(Comparable[] a, int lo, int mid, int hi) {
         //lo到mid这组数据和mid+1到hi这组数据归并到辅助数组assist对应的索引处
         int i = lo;//定义一个指针,指向assist数组中开始填充数据的索引
         int p1 = lo;//定义一个指针,指向第一组数据的第一个元素
         int p2 = mid + 1;//定义一个指针,指向第二组数据的第一个元素
         //比较左边小组和右边小组中的元素大小,哪个小,就把哪个数据填充到assist数组中
         while (p1 <= mid && p2 <= hi) {
             if (less(a[p1], a[p2])) {
                 assist[i++] = a[p1++];
             }
             else {
                 assist[i++] = a[p2++];
             }
         }
         //上面的循环结束后,如果退出循环的条件是p1<=mid,则证明左边小组中的数据已经归并完毕,如果退 出循环的条件是p2<=hi,则证明右边小组的数据已经填充完毕;
         // 所以需要把未填充完毕的数据继续填充到assist中,
         // 下面两个循环,只会执行其中的一个
         while(p1<=mid){
             assist[i++]=a[p1++];
         }
         while(p2<=hi){
             assist[i++]=a[p2++];
         }
         //到现在为止,assist数组中,从lo到hi的元素是有序的,再把数据拷贝到a数组中对应的索引处
         for (int index=lo;index<=hi;index++){
             a[index]=assist[index];
         }
     }

     /* 比较v元素是否小于w元素 */
     private static boolean less(Comparable v, Comparable w) {
         return v.compareTo(w) < 0;
     }

     //测试代码
     public static void main(String[] args) throws Exception {
         Integer[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
         Merge.sort(arr); 
         System.out.println(Arrays.toString(arr));
     }
}

 时间复杂度O(nlogn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值