首页 > 编程语言 >19 -- 排序算法之归并排序

19 -- 排序算法之归并排序

时间:2022-10-02 23:45:30浏览次数:67  
标签:tmp arr right 19 mid -- int 排序 left

 

 

 

 

 

 从合并的示意图中可以看到,其实现思路与“合并两个有序的单链表,使之合并完后依然有序”类似。

 

 1 import java.util.Arrays;
 2 
 3 public class MergeSort {
 4 
 5     public static void main(String[] args) {
 6         int[] arr = {8,4,5,7,1,3,6,2};
 7         int[] tmp = new int[arr.length]; //中转数组
 8         mergeSort(arr, 0, arr.length - 1, tmp);
 9         System.out.println(Arrays.toString(arr));
10     }
11     
12     //分 + 合
13     public static void mergeSort(int[] arr,int left,int right,int[] tmp) {
14         if (left < right) {
15             int mid = (left + right) / 2;
16             //向左递归进行分解
17             mergeSort(arr, left, mid, tmp);
18             //向右递归进行分解
19             mergeSort(arr, mid+1, right, tmp);
20             System.out.println(left + "   " + right);
21             //合并
22             merge(arr, left, right,mid, tmp);
23         }
24     }
25 
26     //合并
27     /**
28      * 
29      * @param arr 待排序的数组
30      * @param left 左边有序数列的初始索引
31      * @param right 右边有序数列的初始索引
32      * @param mid 中间索引
33      * @param tmp 做中转的数组
34      */
35     public static void merge(int[] arr,int left,int right,int mid,int[] tmp) {
36         int i = left; //左边序列的第一个数的索引
37         int j = mid + 1; //右边序列的第一个数的索引
38         int t = 0; //放置tmp数组的索引位置
39         
40         //1、先把左右两边有序的数据按照规则填充到tmp数组,直到有一边的数据填充完毕
41         while(i <= mid && j <= right) {
42             if (arr[i] <= arr[j]) {  //左边有序序列当前元素小于或者等于左边有序序列的当前元素
43                 tmp[t] = arr[i]; //把左边当前元素填充到中转数组中
44                 i++; //左边有序序列继续向后遍历
45                 t++; //中转数组当前指向的位置后移,为下一个将要填充的数腾出位置
46             }else {
47                 tmp[t] = arr[j];
48                 j++;
49                 t++;
50             }
51         }
52         //2、把有剩余数据一边的数据依次填充到tmp数组中
53         while(i <= mid) { //说明左边有序序列还有剩余
54             tmp[t] = arr[i];
55             i++;
56             t++;
57         }
58         
59         while(j <= right) { //说明右边有序序列还有剩余
60             tmp[t] = arr[j];
61             j++;
62             t++;
63         }
64         //3、将tmp数组中的元素拷贝到arr数组中
65         //注:并非每次拷贝都是拷贝所有数据
66         t = 0;
67         int tmpLeft = left;
68         //第一次合并tmpLeft = 0 , right = 1 
69         //第二次合并tmpLeft = 2 , right = 3 
70         //第三次合并tmpLeft = 0 , right = 3
71         // ... ...
72         //最后一次(第七次)合并:tmpLeft = 0; right = 7
73         System.out.println("tmpLeft = " +  tmpLeft + "   right = " +  right);
74         while(tmpLeft <= right) {
75             arr[tmpLeft] = tmp[t];
76             tmpLeft++;
77             t++;
78         }
79     }
80     
81 }

 

标签:tmp,arr,right,19,mid,--,int,排序,left
From: https://www.cnblogs.com/yumengqifei/p/16661283.html

相关文章

  • day08 --> (Javascript)
    JavaScript:概念:是一门客户端脚本语言。运行在客户端浏览器中,每一个浏览器都有JavaScript的解析引擎脚本语言:不需要编译、直接就可以被浏览器解析执行。功能: 可以来增......
  • 四则运算——初级
    SEIndividualProject目录SEIndividualProject四则运算——初级题目需求分析设计编码重构代码测试思路说明时间花费比较已知问题四则运算——初级题目编写一个四则......
  • 实验一
    #include<iostream>usingstd::cout;usingstd::endl;classpoint{public:point(intx0=0,inty0=0);point(constpoint&p);~point()=default;intget_x()co......
  • Tomcat——基本使用
    Tomcat——基本使用  1、下载安装(8.5版本为企业最常用版本)    下载地址:https://tomcat.apache.org/download-80.cgi        或直接点击下载Tomcat8.5.8......
  • 基于SSM+Vue的垃圾分类管理系统的设计与实现Java前后端分离项目(源码调试+讲解+文档)
    ......
  • PipeCAD ISO定制一
    在PipeCAD的PIPING面板上提供管道轴测ISO图的设置选项:通过界面设置出图风格后,可以在生成ISO图界面选择出图选项文件。下面介绍一下在PipeCAD中已经实现的设置选......
  • nginx 代理
    location/prod-api/{proxy_set_headerHost$http_host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerREMOTE-HOST$remote_addr;proxy_se......
  • rocketmq 架构图
     因为相信,所以看见.......
  • RocketMQ学习
    1介绍RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。1.1RocketMQ特点支持发布/订阅(Pub/Sub)和点......
  • numpy简单使用
    1.安装以及测试简介NumPy是一个运行速度非常快的数学库,主要用于数组计算,包含:一个强大的N维数组对象ndarray广播功能函数整合C/C++/Fortran代码的工具线性代数、傅里叶......