package basic_class_01;import java.util.Arrays;
/*** * 堆排序的细节和复杂度分析* 时间复杂度O(N*logN),额外空间复杂度O(1)* 堆结构非常重要1,堆结构的heapInsert与heapify2,堆结构的增大和减少3,如果只是建立堆的过程,时间复杂度为O(N)4,优先级队列结构,就是堆结构**/
public class Code_03_HeapSort {public static void heapSort(int[] arr) {if (arr == null || arr.length < 2) {return;}for (int i = 0; i < arr.length; i++) {heapInsert(arr, i);}int size = arr.length;swap(arr, 0, --size);while (size > 0) {heapify(arr, 0, size);swap(arr, 0, --size);}}//构建大根堆public static void heapInsert(int[] arr, int index) {while (arr[index] > arr[(index - 1) / 2]) {swap(arr, index, (index - 1) / 2);index = (index - 1) / 2;}}//某位置变化后堆的调整public static void heapify(int[] arr, int index, int size) {int left = index * 2 + 1;while (left < size) {int largest = left + 1 < size && arr[left + 1] > arr[left] ? left + 1 : left;//取最大的孩子的下标largest = arr[largest] > arr[index] ? largest : index;if (largest == index) {break;}swap(arr, largest, index);index = largest;left = index * 2 + 1;}}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}// for testpublic static void comparator(int[] arr) {Arrays.sort(arr);}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());}return arr;}// for testpublic static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}// for testpublic static boolean isEqual(int[] arr1, int[] arr2) {if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {return false;}if (arr1 == null && arr2 == null) {return true;}if (arr1.length != arr2.length) {return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;}// for testpublic static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// for testpublic static void main(String[] args) {int testTime = 500000;int maxSize = 100;int maxValue = 100;boolean succeed = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize, maxValue);int[] arr2 = copyArray(arr1);heapSort(arr1);comparator(arr2);if (!isEqual(arr1, arr2)) {succeed = false;break;}}System.out.println(succeed ? "Nice!" : "Fucking fucked!");int[] arr = generateRandomArray(maxSize, maxValue);printArray(arr);heapSort(arr);printArray(arr);}}

04.堆排序 --- HeapSort(左神算法基础班源码)相关推荐

  1. 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)

    package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...

  2. 13.在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。(左神算法基础班源码)

    package basic_class_01; /*** *小和问题在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和.求一个数组的小和.例子:[1,3,4,2,5]1左边比1小的数 ...

  3. 左神算法基础班4_4_3在二叉树中找到一个节点的后继节点

    Problem: 在二叉树中找到一个节点的后继节点 [题目] 现在有一种新的二叉树节点类型如下: public class Node { public int value; public Node l ...

  4. 左神算法基础班3_13深度拷贝含有随机指针的链表

    Problem: 复制含有随机指针节点的链表 [题目] 一种特殊的链表节点类描述如下: public class Node { public int value; public Node next; ...

  5. 左神算法中级班第三课[C++代码]

    左神算法中级班第三课[C++代码] 第一题:流水线打包问题[阿里原题] 代码 第二题 代码 第三题:打印螺旋矩阵 代码 第四题 代码 第五题:判读aim是否在矩阵中 代码 第七题:topK问题 代码 ...

  6. 左神算法初级班笔记4:二叉树

    文章目录 01 | 实现二叉树的先序.中序.后序遍历,包括递归方式和非递归 方式 1.递归版本: 2. 非递归版本: 02 | 在二叉树中找到一个节点的后继节点 03 | 介绍二叉树的序列化和反序列化 ...

  7. java取余数的函数_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  8. igs无法分配驱动器映射表_左神算法基础:哈希函数和哈希表

    笔者在读研刚开始的时候,偶尔看面经,有这样一个问题:只用2GB内存在20亿个整数中找到出现次数最多的数,当时的我一脸懵逼,怎么去思考,20亿个数?What The Fuck! 但是,看完今天的文章,你 ...

  9. 【搞定左神算法初级班】第4节:二叉树及相关常见面试题

    目 录: 题目1:实现二叉树的先序.中序.后序遍历[递归方式和非递归方式] 题目2:在二叉树中找到一个节点的后继节点 题目3:介绍二叉树的序列化和反序列化 题目4:折纸问题 题目5:判断一棵二叉树是否 ...

  10. 《左神算法初级班》第四节课:二叉树结构

    目录: 1)二叉树结构 2)二叉树的递归与非递归遍历 3)打印二叉树 4)判断搜索二叉树 5)判断完全二叉树 6)判断平衡二叉树 7)折纸问题 8)二叉树节点的前驱节点与后继节点 9)二叉树的序列化和 ...

最新文章

  1. OpenCV支持中文字符输出实现
  2. Python基础总结(3)
  3. 10.05 最初对Linux的了解,对Shell的认识
  4. zz 写科技论文的一点体会
  5. map,multimap,unordered_map,unordered_multimap的详解
  6. javascript中Date对象的初始化方法
  7. 佩服!终以一作发Science的她,竟也曾经历“直博转硕士”,艰难毕业!
  8. LuaForUnity7:Lua表与元表
  9. Ubuntu16.04下PCL点云库的安装及使用demo
  10. et文件怎么转成excel_10秒就能将任意格式的文件转成PDF,简单易操作,不学可别后悔...
  11. v-ray 5.0 渲染器参数说明
  12. kotlin入门教程
  13. 【详解】服务可用性详细说明及其解决方案
  14. ggplot2在一幅图上画两条曲线
  15. ipad使用键盘怎么隐藏软键盘_无需鼠标和触屏操作,iPadOS 新功能让你用键盘轻松操控 iPad...
  16. 实现权重抽奖算法(java)
  17. 【硬核】肝了一个月,Cisco网络工程师知识点总结
  18. 【压缩感知合集7】压缩感知RIP有限等距性:定义解析,理解说明,数学原理推导
  19. 2015届秋季面试感悟
  20. 夏洛克和他的女朋友(隐藏质数筛)

热门文章

  1. HQST网络变压器产品品质程序文件/ 网络变压器产品防护管理程序
  2. 最NB 的世界化系统即将要普遍全国,献给咋们辛苦的1年。。
  3. 支付网关接入中的ssl连接和签名调试tips
  4. c语言作业输出姓名班级年龄,C语言结构中根据性别分类按年龄升序输出姓名
  5. 2018 Workshop on Autonomous Driving (WAD)----自动驾驶中视觉感知的比赛
  6. 物联网标准状态:摇摆
  7. 基于Redis的Hyperloglog实现日活量和总活跃量统计
  8. VR拍摄怎么制作,VR拍摄作品有什么功能?
  9. 别再找伪原创文章代写了,AI写作在线平台批量生成更快速
  10. 第十四周----阅读程序(1)(2)