排序和顺序统计量之堆排序
来源:互联网 发布:php文件上传与下载 编辑:程序博客网 时间:2024/06/05 02:33
比较排序算法
我们平时接触到的一些重要的排序算法,插入排序、归并排序、堆排序及快速排序都属于比较排序算法(即都是通过对元素进行比较操作来确定输入数组的次序)。已经证明了任意比较排序算法排序
堆排序
(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。除了最底层,该树是完全充满的,而且是从左向右充满。
堆的根结点是
但是由于Java中数组的下标是从
一个堆中结点的高度定义为该结点到叶结点最长简单路径上边的个数。
二叉堆可以分成两种形式:最大堆和最小堆。
最大堆
最大堆的性质就是除了根结点以外,其他结点满足
最小堆
相应的最小堆与最大堆类似,除了根结点以外,其他结点满足
在堆排序中,我们使用的是最大堆。最小堆通常用在构造优先队列中。
在介绍堆排序算法之前需要了解两个重要的堆的运算,分别是维护堆的性质和建堆。
维护堆的性质(很重要)
维护堆的性质这个操作,核心思想就是,针对一个结点
伪代码如下:
MAX-HEAPIFY(A,i)l=LEFT(i)r=RIGHT(i)if l<=A.heap-size and A[l]>A[i] largest=lelse largest=iif r<=A.heap-size and A[r]>A[i] largest=relse largest=iif largest ≠i exchange A[i] with A[largest] MAX-HEAPIFY(A,largest)
建堆
建堆即是将一个数组
我们首先可以知道,对于数组
伪代码如下:
BUILD-MAX-HEAP(A)A.heap-size=A.lengthfor i=(A.length/2)下取整 downto 1 MAX-HEAPIFY(A,i)
堆排序算法
堆排序算法的思想很简单,首先是调用建堆的过程将一个数组
伪代码如下
HEAPSORT(A)BUILD-MAX-HEAP(A)for i=A.length downto 2 exchange A[1] with A[i] A.heap-size=A.heap-size-1; MAX-HEAPIFY(A,1)
最后根据我们的分析过程给出整个利用最大堆实现堆排序的Java实现代码。
public class HeapSortTest { public static void main(String[]args){ int[] A={ 9, 6, 3, 8, 5, 4, 7, 2, 1}; HeapSort(A); for(int i=0;i<A.length;i++){ System.out.println(A[i]); } } public static void swap(int[] A,int i,int j){ int temp =0; temp=A[i]; A[i]=A[j]; A[j]=temp; } //排序方法 public static void HeapSort(int[] A){ if (A == null || A.length <= 1) { return; } BuildMaxHeap(A); for(int i=0;i<A.length;i++){ System.out.print(A[i]+","); } System.out.println(); int n=A.length; System.out.println("数组长度:"+n); for(int i=n-1;i>=1;i--){ swap(A,0,i); MaxHeapify(A, 0,i); } } //讲给的数组构建成一个最大堆 public static void BuildMaxHeap(int[] A){ if (A == null || A.length <= 1) { return; } int n=A.length; int index=(int)(n-1)/2; for(int i=index;i>=0;i--){ MaxHeapify(A,i,n); } for(int i=0;i<A.length;i++){ System.out.print(A[i]+","); } System.out.println(); } //维护最大堆的性质方法 public static void MaxHeapify(int[] A, int index,int heapSize){ int largest=index; int left=index*2+1; int right=index*2+2; if(left<heapSize && A[left]>A[largest]){ largest=left; } if(right<heapSize && A[right]>A[largest]){ largest=right; } if(largest!=index){ swap(A,index,largest); MaxHeapify(A,largest,heapSize); } }}
最后运行了一下程序。
- 排序和顺序统计量之堆排序
- 排序和顺序统计量与堆排序
- 排序和顺序统计量
- 排序和顺序统计量之简单选择排序
- 算法学习笔记----第二部分:排序和顺序统计量----第6章、堆排序
- MIT:算法导论——4.1.排序和顺序统计量_堆排序
- 第二部分 排序和顺序统计量 第 6 章 堆排序
- 第二部分 排序和顺序统计量
- 排序和顺序统计量(算法导论)
- [学习《算法导论》]第二部分 排序和顺序统计量
- 算法导论学习(二)——排序和顺序统计量
- 排序算法之堆和堆排序
- 中位数和顺序统计学之求解顺序统计量
- 排序之五(顺序统计、中位数法)
- 顺序统计量和中位数
- 排序之堆排序
- 排序之堆排序
- 排序之堆排序
- POM文件详解
- 正则表达式的使用
- 第2章 Docker 的基础知识
- js和jQuery实现对下拉框的指定赋值
- [CQU 21466] zzblack与斐波那契数列 (矩阵快速幂)
- 排序和顺序统计量之堆排序
- 自定义Toast
- Emmet 插件使用教程
- 【图像处理】Haar Adaboost 检测自定义目标(视频车辆检测算法代码)
- PyQt5:建立对话框(1)
- ROC曲线以及评估指标F1-Score, recall, precision-整理版
- android style
- haartraining训练生成xml过程
- HDU 1171.Big Event in HDU【01背包】【5月26】