返回顶部
首页 > 资讯 > 精选 >Java数组实现堆排序的示例分析
  • 256
分享到

Java数组实现堆排序的示例分析

java 2023-05-30 19:05:28 256人浏览 八月长安
摘要

这篇文章主要为大家展示了“Java数组实现堆排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java数组实现堆排序的示例分析”这篇文章吧。数组全部入堆,再出堆从后向前插入回数组中,数

这篇文章主要为大家展示了“Java数组实现堆排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java数组实现堆排序的示例分析”这篇文章吧。

数组全部入堆,再出堆从后向前插入回数组中,数组就从小到大有序了。

public class MaxHeap<T extends Comparable<? super T>> { private T[] data; private int size; private int capacity;  public MaxHeap(int capacity) {  this.data = (T[]) new Comparable[capacity + 1];  size = 0;  this.capacity = capacity; }  public int size() {  return this.size; }  public boolean isEmpty() {  return size == 0; }  public int getCapacity() {  return this.capacity; }   public T seekMax() {  return data[1]; }  public void swap(int i, int j) {  if (i != j) {   T temp = data[i];   data[i] = data[j];   data[j] = temp;  } }  public void insert(T item) {  size++;  data[size] = item;  shiftUp(size); }   public T popMax() {  swap(1, size--);  shiftDown(1);  return data[size + 1]; }   public void shiftUp(int child) {  while (child > 1 && data[child].compareTo(data[child / 2]) > 0) {   swap(child, child / 2);   child = child / 2;  } }   private int max(int a, int b) {  if (data[a].compareTo(data[b]) < 0) {//如果data[b]大   return b;//返回b  } else {//如果data[a]大   return a;//返回a  } }   private int max(int a, int b, int c) {  int biggest = max(a, b);  biggest = max(biggest, c);  return biggest; }    public void shiftDown(int father) {  while (true) {   int lchild = father * 2;//左孩子   int rchild = father * 2 + 1;//右孩子   int newFather = father;//newFather即将更新,父、左、右三个结点谁大,newFather就是谁的下角标    if (lchild > size) {//如果该father结点既没有左孩子,也没有右孩子    return;   } else if (rchild > size) {//如果该father结点只有左孩子,没有右孩子    newFather = max(father, lchild);   } else {//如果该father结点既有左孩子,又有右孩子    newFather = max(father, lchild, rchild);   }    if (newFather == father) {//说明father比两个子结点都要大,表名已经是大根堆,不用继续调整了    return;   } else {//否则,还需要继续调整堆,直到满足大根堆条件为止    swap(father, newFather);//值进行交换    father = newFather;//更新father的值,相当于继续调整shiftDown(newFather)   }  } }  public static <T extends Comparable<? super T>> void sort(T[] arr) {  int len = arr.length;  //入堆  MaxHeap<T> maxHeap = new MaxHeap<T>(len);  for (int i = 0; i < len; i++) {   maxHeap.insert(arr[i]);  }  //出堆  for (int i = len - 1; i >= 0; i--) {   arr[i] = maxHeap.popMax();  } }  public static void printArr(Object[] arr) {  for (Object o : arr) {   System.out.print(o);   System.out.print("\t");  }  System.out.println(); }  public static void main(String args[]) {  Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};  printArr(arr);//3 5 1 7 2 9 8 0 4 6  sort(arr);  printArr(arr);//0 1 2 3 4 5 6 7 8 9 }}

堆排序:对数组进行构造堆(最大堆)

public class MaxHeap<T extends Comparable<? super T>> { private T[] data; private int size; private int capacity;  public MaxHeap(int capacity) {  this.capacity = capacity;  this.size = 0;  this.data = (T[]) new Comparable[capacity + 1]; }  public MaxHeap(T[] arr) {//heapify,数组建堆  capacity = arr.length;  data = (T[]) new Comparable[capacity + 1];  System.arraycopy(arr, 0, data, 1, arr.length);  size = arr.length;  for (int i = size / 2; i >= 1; i--) {   shiftDown(i);  } }  public int size() {  return this.size; }  public int getCapacity() {  return this.capacity; }  public boolean isEmpty() {  return size == 0; }  public T seekMax() {  return data[1]; }  public void swap(int i, int j) {  if (i != j) {   T temp = data[i];   data[i] = data[j];   data[j] = temp;  } }  public void insert(T item) {  size++;  data[size] = item;  shiftUp(size); }  public T popMax() {  swap(1, size--);  shiftDown(1);  return data[size + 1]; }  public void shiftUp(int child) {  while (child > 1 && data[child].compareTo(data[child / 2]) > 0) {   swap(child, child / 2);   child /= 2;  } }   private int max(int a, int b) {  if (data[a].compareTo(data[b]) < 0) {//如果data[b]大   return b;//返回b  } else {//如果data[a]大   return a;//返回a  } }   private int max(int a, int b, int c) {  int biggest = max(a, b);  biggest = max(biggest, c);  return biggest; }  public void shiftDown(int father) {  while (true) {   int lchild = father * 2;   int rchild = father * 2 + 1;   int newFather = father;//这里赋不赋值无所谓,如果把下面这个return改成break,那就必须赋值了    if (lchild > size) {//如果没有左、右孩子    return;   } else if (rchild > size) {//如果没有右孩子    newFather = max(father, lchild);   } else {//如果有左、右孩子    newFather = max(father, lchild, rchild);   }    if (newFather == father) {//如果原父结点就是三者最大,则不用继续整理堆了    return;   } else {//父节点不是最大,则把大的孩子交换上来,然后继续往下堆调整,直到满足大根堆为止    swap(newFather, father);    father = newFather;//相当于继续shiftDown(newFather)。假如newFather原来是father的左孩子,那就相当于shiftDown(2*father)   }  } }  public static <T extends Comparable<? super T>> void sort(T[] arr) {  int len = arr.length;  MaxHeap<T> maxHeap = new MaxHeap<>(arr);  for (int i = len - 1; i >= 0; i--) {   arr[i] = maxHeap.popMax();  } }  public static void printArr(Object[] arr) {  for (Object o : arr) {   System.out.print(o);   System.out.print("\t");  }  System.out.println(); }  public static void main(String args[]) {  Integer[] arr = {3, 5, 1, 7, 2, 9, 8, 0, 4, 6};  printArr(arr);//3 5 1 7 2 9 8 0 4 6  sort(arr);  printArr(arr);//0 1 2 3 4 5 6 7 8 9 }}

以上是“Java数组实现堆排序的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java数组实现堆排序的示例分析

本文链接: https://lsjlt.com/news/220590.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java数组实现堆排序的示例分析
    这篇文章主要为大家展示了“Java数组实现堆排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java数组实现堆排序的示例分析”这篇文章吧。数组全部入堆,再出堆从后向前插入回数组中,数...
    99+
    2023-05-30
    java
  • web中堆排序的示例分析
    这篇文章给大家分享的是有关web中堆排序的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种**选择排序,**它的最坏,最好,平均时间复杂度均为O(...
    99+
    2023-06-27
  • C++实现堆排序示例
    目录堆的实现 Heap.h 堆的管理及接口Heap.c 堆各个接口功能的实现 test.c测试堆的实现 Heap.h 堆的管理及接口 #include<stdio.h&g...
    99+
    2024-04-02
  • Java实现快速排序和堆排序的示例代码
    目录快速排序算法步骤动图演示JavaScript代码实现python代码实现Go代码实现C++代码实现Java代码实现堆排序算法步骤动图演示JavaScript代码实现Python代...
    99+
    2022-12-22
    Java快速排序 Java 堆排序 Java排序
  • 关于java的arrays数组排序AJPFX的示例分析
    这期内容当中小编将会给大家带来有关关于java的arrays数组排序AJPFX的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java API对Arrays类的说明是:此类包含用来操作数组(比如排...
    99+
    2023-06-02
  • C语言数据结构堆排序示例分析
    今天小编给大家分享一下C语言数据结构堆排序示例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。TOP.堆排序前言什么是堆排...
    99+
    2023-06-30
  • c++实现堆排序的示例代码
    看了一下优先队列,查了一下堆排序。堆排序主要就是建最大堆(最小堆)和交换2个操作。如果建的是最大堆,那么交换的时候,父节点就和最大的子节点比较,如果它比最大的子节点还大,那就不用比了...
    99+
    2023-02-02
    c++ 堆排序
  • javascript中Array.sort()数组排序的示例分析
    这篇文章主要为大家展示了“javascript中Array.sort()数组排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中Array.sort()数组排序的示...
    99+
    2023-06-20
  • javascript中数组排序与对象排序的示例分析
    这篇文章将为大家详细讲解有关javascript中数组排序与对象排序的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。javascript  数组排序与对...
    99+
    2024-04-02
  • Java 堆排序实例(大顶堆、小顶堆)
    堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序的平均时间复杂度为Ο(nlogn) 。算法步骤: 创建一个...
    99+
    2023-05-30
    java 堆排序 大顶堆
  • C语言数据结构之堆、堆排序的分析及实现
    目录 1.堆的概念结构及分类1.2堆的分类1.2.1 大堆1.2.2 小堆2. 堆的主要接口3.堆的实现3.1 堆的初始化 HeapInit3.2 堆的销毁 HeapDes...
    99+
    2024-04-02
  • java排序算法的示例分析
    这篇文章将为大家详细讲解有关java排序算法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、直接插入排序基本思想:将一个记录插入到已排序的有序表中,使插入后的表仍然有序对初始关键字{49 38...
    99+
    2023-06-20
  • java实现堆排序以及时间复杂度的分析
    完全二叉树:从上到下,从左到右,每层的节点都是满的,最下边一层所有的节点都是连续集中在最左边。 二叉树的特点就是左子节点是父节点索引值的2倍加一,右子节点是父节点索引值的2倍加二 堆...
    99+
    2024-04-02
  • Python实现的堆排序算法原理与用法实例分析
    本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下: 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的...
    99+
    2022-06-04
    算法 实例 原理
  • js中排序与重组的示例分析
    小编给大家分享一下js中排序与重组的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!示例:function in...
    99+
    2024-04-02
  • Java算法之堆排序代码示例
    堆是一种特殊的完全二叉树,其特点是所有父节点都比子节点要小,或者所有父节点都比字节点要大。前一种称为最小堆,后一种称为最大堆。比如下面这两个: 那么这个特性有什么作用?既然题目是堆排序,那么肯定能用来排序。想要用堆排序首先要创建一...
    99+
    2023-05-30
    java 算法实例 ava
  • java数组的示例分析
    这篇文章给大家分享的是有关java数组的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java数组1) 声明形式:type[] arrayName; 推荐方式type a...
    99+
    2024-04-02
  • Flutter list 数组排序示例解析
    目录按照整数值进行排序按照Person的年龄字段进行排序按照整数值进行排序 以使用Dart的 sort() 方法对Flutter中的List进行升序或降序排序。 sort()方法需要...
    99+
    2023-05-19
    Flutter list 数组排序 Flutter list
  • Angular排序的示例分析
    这篇文章主要为大家展示了“Angular排序的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Angular排序的示例分析”这篇文章吧。angular的排...
    99+
    2024-04-02
  • HashTable排序的示例分析
    小编给大家分享一下HashTable排序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近在做项目过程中,解析XML文档存放到了hashtable中,但...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作