JAVA数据结构中的归并排序

类似于C语言中的归并排序,Java里面的归并也有属于自己的方法

下面可以看下如何通过书写和调用方法进行归并排序的实现

本人JAVA初学者一枚,还请各位大佬多多关照

下图是源码

package sort;

public class Merge {
    //提供计算所需要的数组
    private static Comparable[] assist;
    //比较w元素是否大于v元素
    public static boolean less(Comparable w,Comparable v){
        return w.compareTo(v)<0;

    }

    //元素交换位置

    //对数组a中的元素实现排序
    public static void sort(Comparable[] a){
        //对assist数组进行重置
        assist=new Comparable[a.length];
        //定义一个lo变量和hi变量分别记录最小索引和最大索引
        int lo=0;
        int hi=a.length-1;
        //利用sort重载方法完成数组a中从索引lo到索引hi中的排序
        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;
        //分别对每一组进行排序
        sort(a,lo,mid);
        sort(a,mid+1,hi);
        //把两组进行归并
        merge(a,lo,mid,hi);

    }


    //对数组中。从lo到min元素为一组,从min+1到hi为一组进行归并
    private static void merge(Comparable[] a,int lo,int mid,int hi){
        //定义三个指针
        int i=lo;
        int p1=lo;
        int p2=mid+1;
        //遍历,移动p1和p2索引处的值,找出小的那个,放到辅助数组对应的指针处
        while (p1<=mid&&p2<=hi) {
            if(less(a[p1],a[p2])){
                assist[i++]=a[p1++];
            }
            else{
                assist[i++]=a[p2++];
            }
        }
        //遍历,如果p1指针没有走完,那么顺序移动p1指针,把元素移动到对应辅助数组的索引处
        while (p1<=mid){
            assist[i++]=a[p1++];
        }
        //遍历,如果p2指针没有走完,那么顺序移动p2指针,把元素移动到对应辅助数组的索引处
        while (p2<=hi){
            assist[i++]=a[p2++];
        }
        //把辅助数组中的元素拷贝到a数组中
        for (int index=lo;index<=hi;index++){
            a[index]=assist[index];

        }



    }

}

可以创建一个测试类进行测试调用

package sort;

import java.util.Arrays;

public class MergeTest {
    public static void main(String[] args) {
        Integer[] a={1,3,45,61,651,162,161,56156,156,564,456165,18,81,89156,};
        Merge.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

学艺不精,请各位大佬点评

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南之炎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值