,,java 数据结构之堆排序(HeapSort)详解及实例

,,java 数据结构之堆排序(HeapSort)详解及实例

本文主要介绍java数据结构堆排序的详细讲解和实例的相关资料,有需要的朋友可以参考一下。

1 堆排序

堆是一种重要的数据结构,分为大根堆和小根堆。这是一棵完整的二叉树。如果在底层使用数组存储数据,则假设一个元素编号为i(Java array从0开始,I为0到n-1)。如果它有左子树,那么左子树的位置是2i 1;如果有右子树,则右子树的位置为2i 2;如果有父节点,父节点的位置是(最大堆的任意子树的根节点不小于任意子节点,最小堆的根节点不大于任意子节点。

所谓堆排序就是利用堆这种数据结构的性质对数组进行排序。在数组的非降序排序中,需要大根堆,因为根据大根堆的性质,最大值必须在堆的顶部。堆排序是一种不稳定的排序算法,其时间复杂度为O(nlogn)。

2 算法思想

(1)建立最大堆;

(2)选择顶部,与零位元素交换;

(3)由于步骤(2)中的交换可能会打破最大堆的性质,即第0个位置的元素不再是最大元素,所以需要调用maxHeap来调整堆(结算方式),并根据实际情况重复步骤(2)。

堆排序中最重要的算法是maxHeap。这个函数假设一个元素的两个子节点满足最大堆的性质(即左右子树都是最大堆),只有根元素可能违反最大堆的性质。然后找出元素的最大元素和左右子节点。如果元素是最大的,那么整棵树就是最大堆,程序退出。否则交换根元素和最大元素的位置,继续调用maxHeap进行构建。

3 Java代码

公共类堆排序{

公共静态void main(String[] args) {

int[] arr={3,2,1,0,-1,-2,-3 };

system . out . println(' Before heap:');

打印数组(arr);

堆排序(arr);

System.out.println('堆排序后:');

打印数组(arr);

}

public static void heap sort(int[]arr){

if (arr==null || arr.length=1) {

返回;

}

buildMaxHeap(arr);//建立最大堆

for(int I=arr . length-1;I=1;我- ) {

exchangeElements(arr,0,I);//交换堆的顶部和0位置的元素。

maxHeap(arr,I,0);//因为交换元素后,有可能违背堆的性质,所以把元素定下来

}

}

private Void BuildMaxEAP(int[]arr){//构建最大堆

if (arr==null || arr.length=1) {

返回;

}

int half=arr . length/2;

for(int I=half;I=0;我- ) {

maxHeap(arr,arr.length,I);

}

}

私有静态void maxHeap(int[] arr,int heapSize,int index) {

int left=index * 2 ^ 1;//左侧子树中的元素

int right=index * 2 ^ 2;//右侧子树中的元素

int largest=index//初始化最大值元素

if(left heap size arr[left]arr[index]){

最大=左侧;

}

if(right heap size arr[right]arr[large]){

最大=右;

}

如果(索引!=large){//确定根元素是否为最大元素。

exchangeElements(arr,index,maximum);

maxHeap(arr,heapSize,maximum);

}

}

public static void print array(int[]arr){//打印数组

system . out . print(' { ');

for(int I=0;长度;i ) {

system . out . print(arr[I]);

if (i arr.length - 1) {

System.out.print(',');

}

}

system . out . println(' } ');

}

公共静态void交换元素(int [] arr,int index 1,int index 2){//交换元素

int temp=arr[index 1];

arr[index 1]=arr[index 2];

arr[index 2]=temp;

}

}

感谢您的阅读,希望能帮到您,也感谢您对本站的支持!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • mysql复合索引和组合索引,mysql组合索引数据结构
  • mysql复合索引和组合索引,mysql组合索引数据结构,Mysql之组合索引方法详解
  • mysql复合索引和组合索引,mysql复合索引数据结构
  • mysql复合索引和组合索引,mysql复合索引数据结构,MySQL的复合索引总结
  • b+树 多路搜索树,数据结构中树的分类
  • b+树 多路搜索树,数据结构中树的分类,数据结构-树(三):多路搜索树B树、B+树
  • avl树的构造,avl树特性,数据结构之AVL树详解
  • 数据结构c语言哈夫曼树,c语言哈夫曼树的构造,使用C语言详解霍夫曼树数据结构
  • c语言数据结构算法编程库,数据结构 c语言中文网
  • c语言数据结构算法编程库,数据结构 c语言中文网,C语言编程数据结构基础详解小白篇
  • c++纸牌游戏,数据结构纸牌游戏c语言
  • c++纸牌游戏,数据结构纸牌游戏c语言,C语言实战之纸牌游戏
  • ,,c#解析jobject的数据结构
  • ,,javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
  • ,,Java 数据结构与算法系列精讲之背包问题
  • 留言与评论(共有 条评论)
       
    验证码: