热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java分治排序算法_Java学习笔记——排序算法之进阶排序(堆排序与分治并归排序)...

春蚕到死丝方尽,蜡炬成灰泪始干——无题这里介绍两个比较难的算法:1、堆排序2、分治并归排序先说堆。这里请大家先自行了解完全二叉树的数据结构。堆是完全二叉

春蚕到死丝方尽,蜡炬成灰泪始干

——无题

这里介绍两个比较难的算法:

1、堆排序

2、分治并归排序

先说堆。

这里请大家先自行了解完全二叉树的数据结构。

堆是完全二叉树。大顶堆是在堆中,任意双亲值都大于(或等于)其孩子值,就称其为大顶堆。

堆排序的步骤:

1、把数组想象成一个堆。数组的index+1就是其对应在堆中的序号

2、调堆中各值的顺序,得到大顶堆

3、将堆首位值与堆末尾值交换,最大值排序完毕

4、将堆得大小减1,重复步骤2和步骤3,直到堆中只剩下一个元素。排序完毕

上代码:

1 public classHeapSort {2

3 public static void heapSort(int[] arr){4 //建立完全二叉树,从最后一个双亲开始调整双亲值,直到根,调整完毕后大顶堆建立完成

5 for (int i = arr.length >> 1; i > 0; i --) {6 heapAdjust(arr, i, arr.length);//调用堆要从1到length才符合堆的定义

7 }8 //堆顶和堆低交换,获取最大值,然后调整大顶堆

9 for (int i = arr.length - 1; i > 0; i--) {10 arr[i] = arr[i]^arr[0];11 arr[0] = arr[i]^arr[0];12 arr[i] = arr[i]^arr[0];13 heapAdjust(arr, 1, i);//因为堆计数要从1开始,所以size = endIndex + 1

14 }15 }16 //调整大顶堆.先找左子,然后和右子比,取值大的,在和双亲自己比,自己比儿子大,break,否则交换.注意:根要从1开始才能找到左子

17 public static void heapAdjust(int[] arr, int parents, intsize){18 int j;//孩子们的标记是j,索引全部-1

19 int i = parents;//双亲是i,索引全部-1

20 while (i <<1 <&#61;size) {21 j &#61; i <<1;//左子

22 if (j &#43; 1 <&#61; size) {//有右子

23 if (arr[j - 1] arr[j - 1])27 break;28 arr[i-1] &#61; arr[i-1]^arr[j-1];29 arr[j-1] &#61; arr[i-1]^arr[j-1];30 arr[i-1] &#61; arr[i-1]^arr[j-1];31 i &#61; j;//儿子变为父亲,这里不知道是左子还是右子,所以不能直接通过for循环的迭代步骤<

32 }33 }34 }

再说分治并归排序

这里先要了解什么是递归

1 public classMergingTest {2

3 public static voidmain(String[] args) {4 mSort(0, 3);5 }6 private static void mSort(int left, intright) {7 int m &#61; (left &#43; right)/2;8 if (left &#61;&#61;right) {9 System.out.println(left);10 return;11 }12 mSort(left, m);13 mSort(m&#43;1, right);14 }15 }

这几行代码是并归算法的核心。运行代码将输出0123456789&#xff0c;虽然看上去很简单&#xff0c;但是如果真能明白&#xff0c;说明你已经完全理解递归的思想了&#xff0c;写出并归算法也就不在话下了。

为什么会输出0123呢&#xff1f;

f266f67bca4e91d0d8d534b812785802.png

代码执行的走向&#xff1a;1→2→4→2→5→2→1→3→6→3→7→3→1→return

能领悟这个东西就好办了&#xff0c;上代码:

1 public classMergingSort {2

3 public static void mergingSort(int[] arr) {4 int[] temp &#61; new int[arr.length];

//temp是相当于一张牌&#xff0c;通过left,m,right在逻辑上分成两个数组&#xff0c;进行分治排序,arr是原数组&#xff0c;对数组排序不传数组怎么行&#xff1f;&#xff01;5 mSort(arr, temp, 0, arr.length-1);6 }7 private static void mSort(int[] arr, int[] temp, int left, intright) {

//这里的分组逻辑没有使用到temp和arr&#xff0c;而是把它们作为参数传入merge方法8 int m &#61; (left&#43;right)/ 2;9 if (left &#61;&#61;right) {10 return;11 }12 mSort(arr, temp, left, m);13 mSort(arr, temp, m&#43;1, right);14 merge(arr,temp,left,m,right);15 }16 private static void merge(int[]arr, int[] temp, int left, int m, intright) {

//分治排序极其简单&#xff0c;已知两个有序数组&#xff0c;要把他们合并成一个有序数组&#xff0c;用什么方法都不用说&#xff0c;大家一想就知道了。17 for (int c &#61; 0;c

//使用分支结构&#xff0c;把每摞牌最小的那个挑出来给arr27 if (temp[i]

//使用分支结构&#xff0c;把剩下的那摞牌都塞给arr34 if (i >m) {35 while (j <&#61;right) {36 arr[k&#43;&#43;] &#61; temp[j&#43;&#43;];37 }38 }39 if (j >right) {40 while (i <&#61;m) {41 arr[k&#43;&#43;] &#61; temp[i&#43;&#43;];42 }43 }44 }45

46 }



推荐阅读
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • 本文介绍了如何利用Apache POI库高效读取Excel文件中的数据。通过实际测试,除了分数被转换为小数存储外,其他数据均能正确读取。若在使用过程中发现任何问题,请及时留言反馈,以便我们进行更新和改进。 ... [详细]
  • C++ 进阶:类的内存布局与虚函数类的实现细节
    C++ 进阶:类的内存布局与虚函数类的实现细节 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 在启用分层编译的情况下,即时编译器(JIT)的触发条件涉及多个因素,包括方法调用频率、代码复杂度和运行时性能数据。本文将详细解析这些条件,并探讨分层编译如何优化JVM的执行效率。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 在 Java 中,`join()` 方法用于使当前线程暂停,直到指定的线程执行完毕后再继续执行。此外,`join(long millis)` 方法允许当前线程在指定的毫秒数后继续执行。 ... [详细]
  • 深入解析Java虚拟机的内存分区与管理机制
    Java虚拟机的内存分区与管理机制复杂且精细。其中,某些内存区域在虚拟机启动时即创建并持续存在,而另一些则随用户线程的生命周期动态创建和销毁。例如,每个线程都拥有一个独立的程序计数器,确保线程切换后能够准确恢复到之前的执行位置。这种设计不仅提高了多线程环境下的执行效率,还增强了系统的稳定性和可靠性。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
  • 深入解析零拷贝技术(Zerocopy)及其应用优势
    零拷贝技术(Zero-copy)是Netty框架中的一个关键特性,其核心在于减少数据在操作系统内核与用户空间之间的传输次数。通过避免不必要的内存复制操作,零拷贝显著提高了数据传输的效率和性能。本文将深入探讨零拷贝的工作原理及其在实际应用中的优势,包括降低CPU负载、减少内存带宽消耗以及提高系统吞吐量等方面。 ... [详细]
author-avatar
小天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有