文章目录

  • 堆排序
    • java代码实现
    • 单元测试
  • 归并排序
    • java代码实现
    • 单元测试

堆排序

java代码实现

package csdn.dreamzuora.sort;import java.util.List;/*** Title: 抽象出排序类* Description:** @version 1.0* @author: weijie* @date: 2020/10/22 17:59*/
public abstract class Sort<E> {public void sort(List<E> array){if (array == null || array.isEmpty()){return;}};public void sort(List<E> array, int left, int right){};}
package csdn.dreamzuora.sort;import java.util.List;/*** Title: 堆排序* Description:** @version 1.0* @author: weijie* @date: 2020/10/22 17:51* @url https://www.cnblogs.com/rosesmall/p/9554545.html*/
public class HeapSort extends Sort<Integer>{@Overridepublic void sort(List<Integer> array) {//1.构建大顶堆for(int size = array.size(), i = size / 2 - 1; i >= 0; i--){//从第一个非叶子结点从下至上,从右至左调整结构adjustHeap(array, i, size);}//2.调整堆结构、交换堆顶元素与末尾元素for (int j = array.size() - 1; j > 0; j--){swap(array, 0, j);adjustHeap(array, 0, j);}}/*** 调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上)* @param arr* @param i* @param length*/public void adjustHeap(List<Integer> arr, int i, int length){//先取出当前元素iint temp = arr.get(i);//从i结点的左子结点开始,也就是2i+1处开始for(int k = i*2 + 1; k < length; k = k*2 + 1){//如果左子结点小于右子结点,k指向右子结点if(k+1 < length && arr.get(k) < arr.get(k+1)){k++;}//如果子节点大于父节点,将子节点值赋给父节点(不用进行交换)if(arr.get(k) > temp){arr.set(i, arr.get(k)) ;i = k;}else{break;}}//将temp值放到最终的位置arr.set(i, temp);}private void swap(List<Integer> arr, int a, int b){int temp = arr.get(a);arr.set(a, arr.get(b));arr.set(b, temp);}
}

单元测试

package csdn.dreamzuora.sort;import org.junit.Test;
import org.junit.jupiter.api.Assertions;import java.util.Arrays;
import java.util.List;import static org.junit.Assert.*;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/10/26 23:14*/
public class HeapSortTest {@Testpublic void sort() {HeapSort heapSort = new HeapSort();List<Integer> list = Arrays.asList(4, 5, 2, 6);heapSort.sort(list);Assertions.assertEquals(Arrays.asList(2, 4, 5, 6), list);}
}

归并排序

java代码实现

package csdn.dreamzuora.sort;import java.util.ArrayList;
import java.util.List;/*** Title: 归并排序* Description:* 将数组进行拆分,拆分后按照一定的顺序各自排序,然后再归并到一起,使得归并后的数组仍然有序** 归并排序算法可以利用递归的思想或者迭代的思想去实现。首先我们先把一个无序的数组去拆分,然后利用一定的规则,去合并。* 类似于二叉树的结构。其总的时间复杂度为O( n log n)。空间复杂度为 S(nlogn)** @version 1.0* @author: weijie* @date: 2020/10/22 17:51* @url: https://blog.csdn.net/dreamzuora/article/details/52830740*/
public class MergeSort extends Sort<Integer>{@Overridepublic void sort(List<Integer> a) {if (a == null || a.isEmpty()){return;}List<Integer> b = new ArrayList<>();for (int i = 0; i < a.size(); i++){b.add(0);}merge(a, b,0, a.size());for (int i = 0; i < b.size(); i++){a.set(i, b.get(i));}}private void merge(List<Integer> a, List<Integer> b, int start, int end){//递归出口if (end - start <= 1){return;}int mid = (start + end)/2;int left = start;int right = mid;int index = start;//递归入口merge(a, b, start, mid);merge(a, b, mid, end);//核心处理while (left < mid || right < end){//右区间遍历完成,直接取左区间值if (right >= end){b.set(index ++, a.get(left ++));}else if (left < mid && a.get(left) < a.get(right)){b.set(index ++, a.get(left ++));}else {b.set(index ++, a.get(right ++));}}//原数组赋值for (int i = start; i < index; i++){a.set(i, b.get(i));}}}

单元测试

package csdn.dreamzuora.sort;import org.junit.Test;
import org.junit.jupiter.api.Assertions;import java.util.*;import static org.junit.Assert.*;/*** Title:* Description:** @version 1.0* @author: weijie* @date: 2020/10/28 10:51*/
public class MergeSortTest {@Testpublic void sort() {MergeSort mergeSort = new MergeSort();Random random = new Random();List<Integer> actuallyList = Arrays.asList(random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100), random.nextInt(100));List<Integer> expectList = new ArrayList<>(actuallyList);Collections.sort(expectList);mergeSort.sort(actuallyList);Assertions.assertEquals(expectList, actuallyList);}
}

堆排序和归并排序 java代码实现相关推荐

  1. 排序算法之归并排序(JAVA)

    归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为: 1)划分子表 2)合并 ...

  2. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  3. 归并排序(Java代码实现)

    归并排序 归并排序采用的是分治(divide-and-conquer)法思想. (1)基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的 ...

  4. 三路归并排序(附C++和Java代码)

    三路归并排序(附C++和Java代码) 文章目录 三路归并排序(附C++和Java代码) C++代码: Java代码: PS:阅读此文章需了解归并排序基本原理和二路归并排序 三路归并,即:将待排序数组 ...

  5. Java代码实现归并排序

    Java代码实现归并排序 归并排序(Merge Sort) 思路:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了. ...

  6. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  7. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  8. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  9. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

最新文章

  1. 阿里达摩院 AI医疗 「铸剑」四年:上线170家医院,落地57座城市
  2. 具有实际意义的5种云遣返
  3. 2.5 指数加权平均的偏差修正-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  4. 数字化时代的创新意欲何为?
  5. POJ 3017 DP + 单调队列 + 堆
  6. 创意总监分享:我是如何做一款手游地图的
  7. 安装php-redis遇到Error: Package: php-pecl-igbinary-1.2.1-1.el7.x86_64 (epel)
  8. 重磅!Python又第一了!网友:为什么找不到好工作?真相让人脸红…
  9. ORA-14551: 无法在查询中执行 DML 操作
  10. ThinkPHP6项目基操(4.拦截无效请求 控制器或方法不存在)
  11. 【Listener】监听器基础
  12. Moore-Penrose伪逆(Moore-Penrose广义逆)
  13. 苹果电脑自动重启怎么回事
  14. 手机刷的面具是什么_小米9刷Magisk(面具)详细教程
  15. opencv实现matlab的median()函数
  16. 拓嘉辰丰:拼多多直播推广的付费模式有哪些?
  17. java8 朗姆表达式,Python基础
  18. $.ajax({});的各个参数的理解
  19. 中国有多少博士,博士现在的待遇水平如何?
  20. 2014春节流水帐及杂想

热门文章

  1. 协议簇:TCP 解析: Sequence Number
  2. 炁体源流 鸿蒙,一人之下:八绝技中最强被曝光,没想到炁体源流落榜,第一在后头...
  3. Linux的实际操作:文件目录类的实用指令(创建目录mkdir 删除目录rmdir 递归删除目录rm -rf)
  4. svm算法原理_机器学习——分类算法(1)
  5. 2篇word文档比较重复率_本科论文写作重复率高的原因,毕业论文降重技巧总结!...
  6. python中os模块_Python的武器库11:os模块
  7. 数学C语言编程,数学规划 (最速下降法,c语言编程).doc
  8. 企业门户网站服务器,企业或个人门户网站对服务器前的重要准备 - 酷番云
  9. linux目录隐藏技术,Linux环境下的高级隐藏技术
  10. Java小白零基础学习如何突破自己的方法