归并排序算法

听了韩顺平老师讲的课的总结笔记
归并排序算法_第1张图片
归并排序(Merge-Sort)是利用归并的思想实现的排序方法,该算法采用经典的分治的策略(分治法将问题分成一些小的问题,然后 递归求解,而治(conquer)的阶段则将分的阶段得到的各种答案“修补”在一起,即分而治之。

归并排序算法_第2张图片

归并排序算法_第3张图片

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+=1;
            j+=1;
        }

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

        }


    }
}

你可能感兴趣的:(数据结构算法,归并排序算法)