java排序算法(三):堆排序
2018-06-18 03:09:33来源:未知 阅读 ()
java排序算法(三)堆排序
堆积排序(HeapSort)是指利用堆积树这种结构所设计的排序算法,可以利用数组的特点快速定位指定索引的元素。堆排序是不稳定的排序方法。辅助空间为O(1).最坏时间复杂度为O(nlog2n)
堆排序的堆序的平均性能较接近于最坏性能
堆排序利用大根堆(或者小根堆)堆顶记录的关键字最大(或者最小)这一特征。使得在当前无序区中选中最大(或者最小)关键字的记录变的简单
(1)最大堆的排序思想
· 1、先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
2、再将关键字最大的记录R[1]即堆顶和无序区的最后一个记录R[n]交换。由此得到新的无序区R[1..n-1]和有序区R[n].且满足R[1..n-1].keys <=R[n].key
3、由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆,然后再次将R[1..n-1]和该区的最后一个记录R[n+1]交换。由此得到新的无序区R[1,n-2]和有序区
R[1,n-2].keys<=R[n,n-1].keys,同样将R[1..n-2]调整为堆
直接无序区只有一个元素为止
(2)大根堆排序的基本操作
1、初始化操作;将R[1.n]构造为初始堆
2、每一趟排序的基本操作,将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换。然后将新的无序区调整为堆
注意:
1、只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序
2、小根堆排序和大根堆排序类似。只不过排序结果是递减有序的。堆排序和直接选择排序相反。在任何时刻堆排序中无序区总是在有序区之前。且有序区是在原向量的尾部右后往前逐步扩大到整个向量为止。
代码实现
package com.spring.test; import java.util.zip.DataFormatException; /** * 堆排序 */ public class HeapSortTest { public static void main(String[] args) { int[] data5 = new int[] { 5, 3, 6, 2, 1, 9, 4, 8, 7 }; print(data5); heapSort(data5); System.out.println("排序后的数组"); print(data5); } public static void heapSort(int[] data){ for(int i=0;i<data.length;i++){ createMaxdHeap(data,data.length-1-i); swap(data,0,data.length-1-i); print(data); } } /** * 交换数据 */ public static void swap(int[] data,int i,int j){ if(i==j){ return; } data[i] = data[i]+data[j]; data[j] = data[i]-data[j]; data[i] = data[i]-data[j]; } /** * 打印输出 */ public static void print(int[] data){ for(int i=0;i<data.length;i++){ System.out.print(data[i]+"\t"); } System.out.println(); } /** * 大根堆进行判断 */ public static void createMaxdHeap(int[] data,int lastIndex){ for(int i =(lastIndex-1)/2;i >=0;i--){ //保存当前正在判断的节点 int k = i; //若当前节点的子节点存在 while(2*k+1 <= lastIndex){ //biggerIndex总是记录较大节点的值,先赋值当前判断节点的左子节点 int biggerIndex = 2*k +1; if(biggerIndex < lastIndex){ //若右子节点存在,否则此时biggerIndex应该等于lastIndex if(data[biggerIndex] < data[biggerIndex + 1]){ //若右子节点值比左子节点值大,则biggerIndex记录的是右子节点的值 biggerIndex++; } } if(data[k] < data[biggerIndex]){ /** * 若当前节点的值比子节点的最大值小,则交换两者的值,,交换后将biggerIndex赋值给K * */ swap(data,k,biggerIndex); k = biggerIndex; }else{ break; } } } } }
排序结果
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java集合中的Map接口
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash