数据结构之排序(五)堆排序
2015-10-26 13:52
351 查看
<span style="font-size:18px;">package com.xaut.zyq; import java.util.Arrays; //堆排序就是简单选择排序的一种改进,这种改进的效果是非常明显的。 /* * 堆是具有下列性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆; * 或者 每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。 * 堆排序的基本思想就是将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。 * 将它移走(其实就是将其与将其与堆数组的末尾元素交换,此时末尾元素) */ public class HeapSort { public static void main(String[] args) { int a[]={0,50,10,90,30,70,40,80,60,20}; HeapSort hs=new HeapSort(); System.out.println(Arrays.toString(hs.HeapSort(a))); } private int[] HeapSort(int b[]){ int i; for ( i = b.length/2; i>0; i--) {//将数组b构建成一个大顶堆 HeapAdjust(b,i,b.length-1); } for ( i = b.length-1; i>1; i--) { swap(b,1,i);//将顶堆记录和当前未经排序子序列的最后一个记录交换 HeapAdjust(b, 1, i-1);//将剩下的重新进行调整为大顶堆 } return b; } //函数被第一次调用时,s=b.length/2; m=b.length; private void HeapAdjust(int c[],int s,int m){ int temp,j; temp=c[s]; for(j=2*s;j<=m;j*=2){ if(j<m && c[j]<c[j+1]) ++j; if(temp>=c[j]) break; c[s]=c[j]; s=j; } c[s]=temp; } private void swap(int c[], int m, int n) { int temp = c[m]; c[m] = c ; c = temp; } } /* * 性质5:第一条就说一颗完全二叉树,如果i=1,则结点i是二叉树的根,无双亲; * 如果i>1,则其双亲是结点[i/2]。 * 那么对于有n个结点的二叉树而言,它的i值自然就是小于等于[n/2]了。 * 步骤: * 先建立大顶堆,然后再交换调整 * 再次递归建立新的大顶堆,将最大堆的根节点和最小的位置交换,这样就排序是先选出最大的,接着依次进行。 */</span>
相关文章推荐
- 数据结构之排序(四)希尔排序
- 数据结构之排序(三)直接插入排序
- 数据结构之排序(二)选择排序
- 数据结构之排序(一)冒泡排序
- 第2篇 C# 基本数据结构
- PHP 程序员学数据结构与算法之《栈》
- 数据结构总览
- 严蔚敏 数据结构习题 C语言 4.10~4.13
- 第六周--数据结构--队列的应用之后缀表达式(栈)
- 第六周--数据结构--队列的应用之数制转换(栈)
- 第六周--数据结构--数据结构之括号的匹配(栈)
- 理解红黑树的节点插入和删除
- 常用的数据结构
- 数据结构时间复杂度计算
- 学习笔记之数据结构与算法(三)
- 队列的链式表示和实现
- 排序算法之快速排序
- 数据结构之必需知
- 数据结构学习系列之线性表(五)
- 数据结构实践项目——树和二叉树