广告
返回顶部
首页 > 资讯 > 精选 >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://www.lsjlt.com/news/220590.html(转载时请注明来源链接)

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

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

  • 微信公众号

  • 商务合作