堆排序核心思想是根据现有数组构建大顶堆或者小顶堆,堆顶元素就是该数组的最大值(大顶堆)或者最小值(小顶堆);将该最值按照顺序放到一个“有序区”中,然后将“无序区”中最后一个元素放到堆顶,不断调整使其满足大顶堆或者小顶堆的条件,调整过后处于堆顶的就是剩余无序区中的最大值或者最小值,将该值放入到有序区中......不断如此这般的调整,最终当“无序区”中的元素数量为0的时候,“有序区”中的所有元素就是最终的排序结果。
根据上述描述,在堆排序中有两个问题需要解决:
- 如何初始化堆(如何根据现有数组构建堆结构)
- 如何调整数组使其满足堆结构的要求。
预备知识点:
1.大顶堆是一种“完全二叉树”,所以满足以下特点:
(1)若i>1,则该节点的父节点为tree[i/2]
(2)若i为偶数,而且i<n,那么该节点的兄弟节点为tree[i+1]
2.大顶堆要求节点值必须大于等于左子树中的所有元素值,也必须大于等于右子树中的所有元素值
以下程序通过构建大顶堆获取最大值的方法对若干个无序数字进行升序排序:
import java.util.Scanner; /** 该排序数组下标从1开始,这是和之前的排序方法不同的地方 */ public class HeapSort{ public static void main(String args[]){ Scanner scanner=new Scanner(System.in); int total=scanner.nextInt(); int[] array=new int[1025]; for(int i=1;i<=total;i++){ array[i]=scanner.nextInt(); } heapSort(array,total); output(array,total); } public static void output(int[] array,int total){ for(int i=1;i<=total;i++){ System.out.print(array[i]+" "); } System.out.println(); } public static void heapSort(int[] array,int total){ //创建初始大顶堆 buildHeap(array,total); //不断调整大顶堆,获取最终的有序序列 for(int i=total;i>1;i--){ int temp=array[1]; array[1]=array[i]; array[i]=temp; adjustHeap(array,1,i-1); } } public static void buildHeap(int[] array,int total){ for(int i=total/2;i>=1;i--){ adjustHeap(array,i,total); } } public static void adjustHeap(int[] array,int start,int end){ int temp=array[start]; for(int j=2*start;j<=end;j*=2){ if(j<end&&array[j]<array[j+1]){ j++; } if(temp>=array[j]){ break; } array[start]=array[j]; start=j; } array[start]=temp; } }
测试数据,还是使用MyRandom类产生的1024个数据:
import java.util.Random; public class MyRandom { public static void main(String args[]){ int[] array=new int[1024]; for(int i=0;i<1024;i++){ array[i]=i; } for(int i=0;i<=1023;i++){ int m=new Random().nextInt(1024); int n=new Random().nextInt(1024); int temp=array[m]; array[m]=array[n]; array[n]=temp; } System.out.println("1024"); for(int i=0;i<1024;i++){ System.out.print(array[i]+" "); } System.out.println(); } }
运行方法:
java MyRandom | java HeapSort
相关推荐
数据结构排序 堆排序 堆排序是一种常用的排序算法,它使用大堆进行排序。下面是堆排序的详细知识点说明: 堆排序定义 堆排序是一种比较排序算法,它使用大堆(max heap)来对数组进行排序。堆排序的时间复杂度为O...
总结来说,堆排序是一种利用堆数据结构进行排序的有效方法,它包括了建堆和调整堆两个关键步骤。在C++中,堆排序可以通过自定义函数实现,如`heapify()`、`buildHeap()`和`heapSort()`。理解并实践这些函数的编写,...
堆排序是一种基于比较的排序算法,它利用了数据结构中的“堆”这一概念。在数据结构中,堆通常被理解为一个完全二叉树,它满足堆的性质:父节点的值要么大于或等于其子节点(大顶堆),要么小于或等于其子节点(小...
### 数据结构课程设计实验报告——堆排序 #### 一、堆排序概述 堆排序是一种基于树形选择的排序算法,其核心在于利用完全二叉树的性质进行元素的选择与排序。在排序过程中,将待排序的数据集合视为一颗完全二叉树...
数据结构习题堆排序程序,将每行代码前的注释去掉即可运行
堆排序是一种基于比较的排序算法,它利用了二叉堆(通常为最大堆)的数据结构来完成排序过程。堆排序可以分为两个阶段:构建最大堆与交换堆顶元素并重新调整堆。 - **构建最大堆**:初始时将待排序数组构建成一个...
数据结构——堆排序 数据结构——堆排序 数据结构——堆排序 数据结构——堆排序 数据结构——堆排序 数据结构——堆排序
"C语言学习之排序数据结构链表堆排序希尔排序快速排序递归排序" 本资源主要介绍了C语言中的排序算法,包括链表、堆排序、希尔排序、快速排序和递归排序等五种方法。同时,文章还提供了每种排序方法的原理、流程图和...
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
数据结构实验,顺序表单链表的基本操作,堆排序等到等
首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个完全二叉树,可以分为最大堆或最小堆,其中每个父节点的值都大于或等于其子节点。堆排序的过程包括构建初始堆和调整堆。首先,将无序...
《数据结构排序算法演示系统详解》 在计算机科学领域,数据结构与排序算法是至关重要的基础知识,它们直接影响到程序的效率和性能。本文将详细解析“数据结构排序算法演示系统”,探讨其中蕴含的多种排序算法及其原...
堆排序利用了堆这种数据结构,可以在线性时间内构建堆,然后通过交换堆顶元素与末尾元素来达到排序的目的;直接插入排序则是将新元素插入到已排序的序列中适当位置,适用于近似有序的序列。 在近似有序的序列中,...
严蔚敏教授的《数据结构》一书是学习数据结构的经典教材,其中对堆排序有详细的介绍和伪码描述。 1. 堆的定义与性质: - 完全二叉树:在堆中,数据元素按照完全二叉树的形式存储,也就是说除了最后一层外,每一层...
数据结构堆排序的java算法实现,里面用java语言实现了堆排序的算法实现,有输入和输出结果
在这个数据结构报告中,我们将深入探讨七种不同的内排序算法:简单选择排序、冒泡排序、插入排序、快速排序、两路合并排序以及堆排序。这些排序算法在C++语言环境下进行了实现,并且包含了详细的源代码和实验报告,...
按照算法导论上的伪代码写出的堆数据结构,实现的是最大堆的堆排序
堆排序是一种基于比较的排序算法,它利用了完全二叉树的特性来组织和操作数据。在数据结构中,堆通常被定义为一个近似完全二叉树的结构,并且满足堆属性:父节点的键值总是大于或等于(最大堆)或小于或等于(最小堆...