排序算法-归并排序

2022/5/31 1:21:27

本文主要是介绍排序算法-归并排序,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

归并排序介绍

 

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

归并排序思想示意图 1-基本思想:

 

 

 

归并排序思想示意图 2-合并相邻有序子序列:

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将

[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤

归并排序的应用实例

给你一个数组, val arr = Array(8, 4, 5, 7, 1, 3, 6, 2 ), 请使用归并排序完成排序。

 

代码演示

package com.xuge.sort;

import java.util.Arrays;

/**
 * author: yjx
 * Date :2022/5/3021:22
 **/
public class MergeSort {
  public static void main(String[] args) {
    int arr[] = {8, 4, 5, 7, 1, 3, 6, 2};
    int temp[]=new int [arr.length];
    mergeSort(arr, 0, arr.length-1, temp);
    System.out.println("====归并排序后==="+ Arrays.toString(arr));
  }
  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);

      //合并
      merge(arr,left,mid, right, temp);
    }
  }

  /**
   * @param arr   数组
   * @param left  左边索引
   * @param mid   中间索引
   * @param right 右边索引
   * @param temp  中转数组
   */
  public static void merge(int[] arr, int left, int mid, int right, int temp[]) {
    int i = left;//初始化i,左边有序序列初始索引
    int j = mid + 1;//初始化j,右边有序序列初始索引
    int t = 0;//指向temp数组的当前索引


    //1.先把左右两边数据填充到temp数组
    //直到左右两边有序序列,有一边处理为止
    while (i <= mid && j <= right) {//继续执行
      //如果左边有序序列小于等于右边有序序列当前元素拷贝到temp中
      if (arr[i] < arr[j]) {
        temp[t] = arr[i];
        t += 1;
        i += 1;
      } else {//反之 右边有序序列当前元素拷贝到temp中
        temp[t] = arr[j];
        t += 1;
        j += 1;

      }
    }

    //2.把有剩余的一方剩余数据全部一次填充到temp
    while (i <= mid) {//说明左边有序序列剩余
      temp[t] = arr[i];
      t += 1;
      i += 1;
    }


    while (j <= right) {//说明右边有序序列剩余
      temp[t] = arr[j];
      t += 1;
      j += 1;
    }
    //3.将temp数组元素拷贝到arr
    t = 0;
    int tempLeft = left;
    System.out.println("tempLeft="+tempLeft+",right="+right);
    while(tempLeft<=right){//第一次合并
      arr[tempLeft]=temp[t];
      t+=1;
      tempLeft+=1;
    }

  }
}

速度测试

 public static void main(String[] args) {
//    int arr[] = {8, 4, 5, 7, 1, 3, 6, 2};
//    int temp[] = new int[arr.length];
//    mergeSort(arr, 0, arr.length - 1, temp);
//    System.out.println("====归并排序后===" + Arrays.toString(arr));


    int arr2[] = new int[8000000];
    for (int i = 0; i < 80000; i++) {
      arr2[i] = (int) (Math.random() * 800000000);//生成随机数[0,80000000);
    }
    int temp[]=new int [arr2.length];
    System.out.println("====输出数组=====");
    Date data = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String str = sdf.format(data);
    System.out.println("排序前的时间是:" + str);//23
    mergeSort(arr2, 0, arr2.length-1, temp);
    Date data2 = new Date();
    String str2 = sdf.format(data2);
    System.out.println("排序后的时间是" + str2);//25
  }

  

 

 



这篇关于排序算法-归并排序的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程