堆排序-Java实现
2018-07-22 05:48:19来源:博客园 阅读 ()
复习排序算法时,自己写了一个堆排序的Java实现,重点是容易理解。
Talk is cheap,直接上代码;
1 /** 2 * Created by hardaway on 2018/7/20. 3 * 堆排序(heap) 4 * 本代码用大顶堆实现 5 * 1.构建大顶堆. 2.取走堆顶元素,更新大顶堆,直到堆空; 6 * 时间复杂度O(NlgN),最好,最坏,平均时间复杂度都是O(NlgN) 7 * 不稳定排序 8 */ 9 public class HeapSort { 10 public void sort(int[] arr){ 11 construct(arr); //构建大顶堆 12 for(int i = 0; i<arr.length-1; i++){ 13 swap(arr, 0, arr.length-1-i); //取走堆顶元素,即将最大的元素与当前未排序序列中的末尾元素交换位置; 14 restructure(arr,0, arr.length-1-i); //重构大顶堆 15 } 16 } 17 public void construct(int[] arr){ //构建大顶堆,很重要的一点是,arr.length/2-1这个位置的元素是最后一个有子节点的元素; 18 for(int i = arr.length/2-1; i>=0; i--){ 19 restructure(arr, i, arr.length); 20 } 21 } 22 public void restructure(int[] arr, int index, int arrLength){ 23 if(index>arrLength/2-1) 24 return; 25 int temp = 2*index+1; 26 if(((2*index+2)<arrLength)&&(arr[2*index+1]<arr[2*index+2])) 27 temp = 2*index+2; 28 if(arr[index]<arr[temp]) 29 swap(arr, index, temp); 30 else 31 return; 32 restructure(arr, temp, arrLength); //递归构建,保证它的子节点也是大顶堆 33 } 34 public void swap(int[] arr, int i, int j){ //交互位置,没什么好说的 35 int temp = arr[i]; 36 arr[i] = arr[j]; 37 arr[j] =temp; 38 } 39 public static void main(String[] args) { //测试用例 40 int[] arr = {9,3,1,4,2,7,8,6,5}; 41 System.out.println(Arrays.toString(arr)); 42 HeapSort m = new HeapSort(); 43 m.sort(arr); 44 System.out.println(Arrays.toString(arr)); 45 } 46 }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:给级联属性进行赋值
- DES/3DES/AES 三种对称加密算法实现 2020-06-11
- 1-Java基础回顾整理_01 2020-06-10
- SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后 2020-06-10
- Spring Boot 实现定时任务的 4 种方式 2020-06-10
- JSP+SSH+Mysql+DBCP实现的租车系统 2020-06-09
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