[置顶] java 堆排序
2017-03-26 14:27
239 查看
一、堆排序是什么
是对树形选择排序进一步的改进,以弥补树形选择排序占用空间多的遗憾。采用堆排序的时候,需要一个记录大小的辅助空间,这个空间很小。堆排序的过程中将向量中储存的数据看作是是一颗完全二叉树,利用完全二叉树中双亲结点和孩子结点之间的内在关系选择关键字最小的记录。即排序记录仍采用向量数组方式存储,并非采用树的存储方式,而只是采用完全二叉树的顺序结构的特征。
二、算法思想
将待排序的关键字放在一个数组里k[1...n],将k看作是一颗完全二叉树的顺序表示,每个节点表示一个记录,第一个看k[1]记录作为二叉树的根,k[2]到k
按顺序排列,任意结点k[i]的做孩子是k[2i],右孩子是k[2i+1],双亲是k[i/2]。对这颗完全二叉树调整建堆。
称各结点的关键字值满足条件:k[i].key>=r[2i].key;且k[i].key>=k[2i+1]的完全二叉树为大根堆,反之,若这颗完全二叉树中的任意结点的关键值都小于等于它的左孩子和右孩子的关键值(当有左孩子和右孩子时)则称为小根堆。
三、实现步骤
建堆->使得前n-1个元素调整为堆,具体看代码
是对树形选择排序进一步的改进,以弥补树形选择排序占用空间多的遗憾。采用堆排序的时候,需要一个记录大小的辅助空间,这个空间很小。堆排序的过程中将向量中储存的数据看作是是一颗完全二叉树,利用完全二叉树中双亲结点和孩子结点之间的内在关系选择关键字最小的记录。即排序记录仍采用向量数组方式存储,并非采用树的存储方式,而只是采用完全二叉树的顺序结构的特征。
二、算法思想
将待排序的关键字放在一个数组里k[1...n],将k看作是一颗完全二叉树的顺序表示,每个节点表示一个记录,第一个看k[1]记录作为二叉树的根,k[2]到k
按顺序排列,任意结点k[i]的做孩子是k[2i],右孩子是k[2i+1],双亲是k[i/2]。对这颗完全二叉树调整建堆。
称各结点的关键字值满足条件:k[i].key>=r[2i].key;且k[i].key>=k[2i+1]的完全二叉树为大根堆,反之,若这颗完全二叉树中的任意结点的关键值都小于等于它的左孩子和右孩子的关键值(当有左孩子和右孩子时)则称为小根堆。
三、实现步骤
建堆->使得前n-1个元素调整为堆,具体看代码
package com.lzq.relect; /** * Created by lzqon 2017/3/26. */ public class HeapSort { public static void filt(int[] a, int k, int m) { int bg = a[k];//存储根节点上的数据 int i = k;//定义开始索引 int j = 2 * i;//根结点的左子树 boolean finished = false; while (j <= m && !finished) { if (j + 1 <= m && a[j] < a[j + 1])/**判断是否存在右子树,若有则将右子树的坐标赋值给左子树,沿右分支筛选*/ j = j + 1; if (bg >= a[j]) /*判断自己的左/右子树是否大于本身*/ { finished = true;//若左右子树不大于自身,则结束 } else { /*反之,则将自己的左/右子树赋值给自己,如此往复*/ a[i] = a[j]; i = j; j = 2 * i; } } a[i]=bg;//最后把根上的值放到对应的位置 } /** *初始化堆:从数组的第n/2中间开始把所有子树调整为堆,逐层向上倒退,直到根结点 * @param a 数组 * @param n 数组的长度 */ public static void crt_heap(int[] a, int n){ for(int i=n/2;i>=1;--i){ filt(a,i,n); } } static void HeapSortMethod(int[] a,int n){ crt_heap(a,n);//建立堆 for (int i = n; i>=2 ; --i) {/*堆顶元素此时为最大,只要循环将前i-1个元素调整为堆*/ int b=a[1]; 4000 a[1]=a[i]; a[i]=b; filt(a,1,i-1); } } public static void main(String args[]){ int aa[]={1,2,6,8,5,6}; HeapSortMethod(aa,5); for (int i:aa) { System.out.println(i); } } }
相关文章推荐
- [置顶] 排序算法之堆排序 Java 实现
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- 排序算法复习(Java实现)(二): 归并排序,堆排序,桶式排序,基数排序
- java之将窗口置顶!...
- [置顶] 中缀表达式转成后缀表达式(含java实现的具体代码)
- [置顶] Java的一些类型转换
- [置顶] 用Java编写你自己的简单HTTP服务器
- 算法导论Java实现-堆排序(6.4章节)
- [置顶]《与Java相恋》(初级篇)四-Java面向对象编程基础(一)
- [置顶]教你如何秒杀12306,JAVA程序抢票成功!分享~~~[附截图]
- 堆排序(java)
- 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序
- Java实现快速排序、归并排序、堆排序
- java之将窗口置顶!...
- Java排序算法(三):堆排序
- 排序算法复习(Java实现):插入,冒泡,选择,Shell,快速排序, 归并排序,堆排序,桶式排序,基数排序
- JAVA 堆排序
- 《算法导论的Java实现》 7 堆排序
- [置顶] [转]Java多线程--让主线程等待所有子线程执行完毕
- java 实现堆排序