ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

分治排序(Java)

2021-07-28 15:32:54  阅读:123  来源: 互联网

标签:arr Java temp int 分治 ++ 数组 排序 left


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++;
        }
    }
}

标签:arr,Java,temp,int,分治,++,数组,排序,left
来源: https://blog.csdn.net/weixin_49048155/article/details/119181343

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有