堆排序核心思想是根据现有数组构建大顶堆或者小顶堆,堆顶元素就是该数组的最大值(大顶堆)或者最小值(小顶堆);将该最值按照顺序放到一个“有序区”中,然后将“无序区”中最后一个元素放到堆顶,不断调整使其满足大顶堆或者小顶堆的条件,调整过后处于堆顶的就是剩余无序区中的最大值或者最小值,将该值放入到有序区中......不断如此这般的调整,最终当“无序区”中的元素数量为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
相关推荐
堆排序 使用大堆进行排序 有实例 可以直接运行
数据结构习题堆排序程序,将每行代码前的注释去掉即可运行
数据结构中的堆排序,利用C语言实现,在VC++6.0环境下实现。
包括静态链表的 创建 遍历 及堆排序算法实现…希望大家多多指教…
数据结构——堆排序 数据结构——堆排序 数据结构——堆排序 数据结构——堆排序 数据结构——堆排序 数据结构——堆排序
实现以下常用的内部排序算法并进行性能比较:"直接插入排序"," 折半插入排序"," 2—路插入排序"," 表插入排序"," 希尔排序"," 起泡排序"," 快速排序"," 简单选择排序"," 树形选择排序"," 堆排序"," 归并排序"," 链式...
C 排序 数据结构 链表 堆排序 希尔排序 快速排序 递归排序。详细解释了每个排序方法原理,并带有程序代码。是学习C语言的绝好资料
数据结构实验,顺序表单链表的基本操作,堆排序等到等
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。
堆排序,关于数据结构,用C语言写的,还算一般,望大家积极下载。
数据结构:11 第9章 排序 补充堆排序.ppt
数据结构 排序算法 快速排序 堆排序 冒泡 选择排序 折半排序 希尔排序 归并排序 插入
数据结构堆排序的java算法实现,里面用java语言实现了堆排序的算法实现,有输入和输出结果
数据结构试验堆排序MFC // HeapSortDlg.h : header file // #if !defined(AFX_HEAPSORTDLG_H__DA227A0F_D8D2_459E_A6AE_1F11F292DDDD__INCLUDED_) #define AFX_HEAPSORTDLG_H__DA227A0F_D8D2_459E_A6AE_1F11F292...
按照算法导论上的伪代码写出的堆数据结构,实现的是最大堆的堆排序
随机产生1000个0~9的数,并分别用堆排序,快速排序,归并排序将产生的这1000个随机数排序,并将排序结果写入文件
使用C语言编写的数据结构程序,为堆排序算法的实现。可作为课程设计题目来做。
用函数实现堆排序,并输出每趟排序的结果 Input 第一行:键盘输入待排序关键的个数n 第二行:输入n个待排序关键字,用空格分隔数据 Output 第一行:初始建堆后的结果 其后各行输出交换堆顶元素并调整堆的结果,数据...
不稳定的排序算法:快速排序、希尔排序、堆排序、选择排序(简记:快些选堆)所需辅助空间最多:归并排序。所需辅助空间最少:堆排序。平均速度最快:快速排序。当n较大,则应采用时间复杂度为O(nlogn)的排序方法:...