JAVA-归并排序

1,介绍

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分为一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案“修复”在一起)

2,思路示意图

 

3,代码

/**********归并排序************/
@Test
public void test12(){
    int[] array = {8,4,5,7,1,3,6,2};
    int[] tmp=new int[array.length];
    mergeSort(array, 0, array.length-1, tmp);
    System.out.println(Arrays.toString(array));
}

void mergeSort(int[] array, int left, int right, int[] tmp){
    if (left <right){
        int mid =(left + right)/2;
        //向左递归进行分解
        mergeSort(array, left, mid, tmp);
        //向右递归进行分解
        mergeSort(array, mid + 1, right, tmp);
        //合并
        merge(array, left, right, mid, tmp);
    }
}

/**
 * 合并方法
 * @param array 原始数组
 * @param left  左边索引
 * @param right 右边索引
 * @param mid 中间索引
 * @param tmp 临时数组
 */
void merge(int[] array, int left, int right, int mid, int[] tmp){
    int i = left;
    int j = mid + 1;
    int t = 0;
    //  1
    // 把左右两边的数组按照顺序填充到tmp临时数组,直到左右两边有其中一边处理结束
    while (i <= mid && j <= right) {
        //左边元素小于当前值,填充到tmp数组
        if (array[i] <= array[j]) {
            tmp[t] = array[i];
            t++;
            i++;
        } else {//右边元素小于当前值,填充到tmp数组
            tmp[t] = array[j];
            t++;
            j++;
        }

    }
    // 2
    //把有剩余数据的一边的数据依次全部填充到temp
    while (i <= mid) {
        tmp[t] =array[i];
        i++;
        t++;
    }
    while (j <= right) {
        tmp[t] =array[j];
        j++;
        t++;
    }
    // 3
    //将temp数组的元素拷贝到array注意,并不是每次都拷贝所有;
    t = 0;
    int tmpLeft =left;
    while (tmpLeft <= right){
        array[tmpLeft] = tmp[t];
        t+=1;
        tmpLeft+=1;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值