归并排序算法

听了韩顺平老师讲的课的总结笔记
在这里插入图片描述
归并排序(Merge-Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治的策略(分治法将问题分成一些小的问题,然后 递归求解,而治(conquer)的阶段则将分的阶段得到的各种答案“修补”在一起,即分而治之。
tmpleft的合并的顺序对应如图的7次合并
0(tmpleft),1(right) 2(tmpleft),3(right) 0(tmpleft),3(right) 4(tmpleft),5(right) 6(tmpleft),7(right) 4(tmpleft),7(right) 0(tmpleft),7(right)

在这里插入图片描述

在这里插入图片描述

package com;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class MergeSort{
    public static void main(String[] args) {
        int[] arr=new int[8];
        for (int i = 0; i < arr.length; i++) {
            arr[i]= (int) (Math.random()*8000);

        }
//        int[] arr={8,4,5,7,1,3,6,2};
        int[] temp=new int[arr.length];

        Date date=new Date(  );
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        System.out.println( "排序前的时间:"+sdf.format( date ) );
//        int temp[]=new int[arr.length];两个方法都可以
        mergeSort( arr,0,arr.length-1,temp );


        System.out.println( "归并排序后的数组"+Arrays.toString( arr ) );
        Date date1=new Date();
        System.out.println("排序后的时间:"+ sdf.format( date1 ) );

    }
    //    分的方法(用来排序)
    public static void mergeSort(int[] arr,int left,int right,int [] temp){
        if(left<right){
            int mid=(left+right)/2;//中间的索引

//            向左递归 直到反所有的数分开
            mergeSort(arr,left,mid,temp );
//            向右递归

            mergeSort( arr,mid+1,right,temp );
//            分一次合并一次(合并的过程会进行相关的排序计算)

            meger(arr, left,mid,right, temp);


        }



    }



// 合并的方法
    /*
     * @param arr 定义的数组
     * @param left
     *
     * @param mid 定义的中间的索引
     * @param right 定义的右边的索引
     * @param temp 定义的中间的数组
     * */

    public static void meger(int[] arr,int left,int mid,int right,int[] temp){
        int i=left;//定义左边有序序列的索引
        int j=mid+1;//右边有序序列的索引
        int t=0;//指向temp数组的当前的索引

//     1.   先把左右两边(有序的数据)按照规则填充到temp数组
//        直到所有的有序序列全部填充完毕
        while(i<=mid&&j<=right){
            if(arr[i]<=arr[j]){//填充小的
                temp[t]=arr[i];
                t++;
                i++;
            }else{
                temp[t]=arr[j];
                t++;
                j++;
            }



        }

//     2.   把剩余的数据填充到temp数组
        while(i<=mid){//左边剩余
            temp[t]=arr[i];
            t+=1;
            i+=1;
        }
//        右边剩余
        while(j<=right){

            temp[t]=arr[j];
            t++;
            j++;
        }

        t=0;//重新让t从0开始
//3.把temp数组赋值给arr数组
        int tmpleft=left;//等于数组arr左边
//        最后的 tmp=7;t=7;也就是长度为8的数组被完全的赋值

        System.out.println("tmpleft"+tmpleft+"\t"+"right"+right);
        while(tmpleft<=right){
            arr[tmpleft]=temp[t];
            t++;
            tmpleft++;

        }


    }
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有时间指导毕业设计

觉得写的好的话可以给我打赏

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

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

打赏作者

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

抵扣说明:

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

余额充值