分治排序(Java)

2021/7/28 17:07:37

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

package com.yhl.sort;

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

/**
 * 分治排序:
 * 80000条数据排序花费的时间:1s不到
 */
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, 7, temp);
//        System.out.println(Arrays.toString(arr));

        int[] arr = new int[80000];
        int[] temp = new int[arr.length];
        for (int i = 0; i < 80000; i++) {
            arr[i] = (int) (Math.random()*80000);
        }

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
        Date date = new Date();
        String dateString = format.format(date);
        System.out.println("排序前的时间:" + dateString);

        mergeSort(arr, 0, 79999, temp);

        Date date1 = new Date();
        String dateString1 = format.format(date1);
        System.out.println("排序前的时间:" + dateString1);
    }

    //分治排序
    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;//左边数组的起始下标
        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、将剩余数依次添加到数组中
        while (i <= mid){
            temp[t] = arr[i];
            t++;
            i++;
        }

        while (j <= right){
            temp[t] = arr[j];
            t++;
            j++;
        }

        //3、将合并好的数组复制回原数组中
        t = 0;//从temp数组的开头开始复制
        int tempLeft = left;//需要复制回的原数组的下标

        while (tempLeft <= right){
            arr[tempLeft] = temp[t];
            t++;
            tempLeft++;
        }
    }
}



这篇关于分治排序(Java)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程