堆排序、桶排序、优先级队列、比较器
package com.sf.sort;import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ConcurrentLinkedQueue;import static com.sf.sort.SimpleSortingXORBisector.getArr;
import static com.sf.sort.SimpleSortingXORBisector.systemSort;/*** 堆排序、桶排序、优先级队列、比较器* @author yzy* @create 2022-10-19-21:56*/
public class HeapSortBucketSortPriorityQueueComparator {/*** 向下调整大根堆的结构 <br>* 用于将数组结构调整为堆 <br>* @param arr int[]* @param index int* @param heapSize int*/public static void heapify(int[] arr,int index,int heapSize){// 左节点int left=(index<<1)+1;while (left<heapSize){// 找到左右节点最大的节点int largest=left+1<heapSize&&arr[left]<arr[left+1] ? left+1:left;// 若儿子节点大于父节点,则交换位置,继续从儿子节点向下调整堆结构// 反之则结束循环if (arr[largest]>arr[index]){swap(arr,index,largest);}else {break;}index=largest;left=(index<<1)+1;}}/*** 向上调整大根堆的结构 <br>* 用于插入节点时,维持大根堆结构 <br>* @param arr int[]* @param index int*/public static void heapInsert(int[] arr,int index){// 父节点int father =(index-1)/2;while (index>0){// 若儿子节点大于父节点,则交换位置,继续从新的父节点向上调整结构// 反之结束循环if (arr[father]<arr[index]){swap(arr, father,index);}index= father;father =(index-1)/2;}}/*** 插入元素到堆中,返回一个新的堆* @param arr int[]* @param value int* @return int[]*/public static int[] addHeap(int[] arr,int value){int[] temp = Arrays.copyOf(arr, arr.length + 1);temp[arr.length]=value;heapInsert(temp,temp.length-1);return temp;}/*** 堆排序 <br>* O(N*logN),额外空间复杂度O(1)* @param arr int[]*/public static void heapSort(int[] arr){// 堆长度等于数组长度int heapSize=arr.length;// 用向下调整堆结构,使得数组为大根堆for (int i = (heapSize-1)/2; i >=0 ; i--) {heapify(arr,i,heapSize);}// 每次将数组第0位与最后一位交换,再将堆长度减一// 再从堆第0位向下调整堆结构for (int i = 0; i < arr.length; i++) {swap(arr,0,heapSize-1);heapSize--;heapify(arr,0,heapSize);}}/*** 系统堆排序* @param arr int[]*/public static void systemHeapSort(int[] arr){// add 添加元素到优先级队列中(默认小跟堆)// poll 移除根节点,并返回值// peek 不移除根节点,返回值PriorityQueue<Integer> heap = new PriorityQueue<>();for (int k:arr) {heap.add(k);}for (int i = 0; i < arr.length; i++) {arr[i]=heap.poll();}}/*** 将一个大致有序的数组,从小到大排序 <br>* 要求:不能移动数组元素距离超过K* @param arr int[]* @param k int*/public static void heapSortNotOutK(int[] arr,int k){if (arr.length<=1){return;}PriorityQueue<Integer> heap = new PriorityQueue<>();int min=Math.max(arr.length,k);for (int i = 0; i < min; i++) {heap.add(arr[i]);}int index=0;while (index+min<arr.length){arr[index]=heap.poll();heap.add(arr[index+min]);index++;}while (heap.size()>0){arr[index]=heap.poll();index++;}}/*** 自定义比较器,定制比较规则*/public static class MyComparator implements Comparator<Integer>{// 返回正数,将O2放前面// 返回负数,将O1将前面@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}}/*** 桶排序(计数排序) <br>* 将桶的索引作为数组值,桶的值作为频数* @param arr int[]*/public static void countSort(int[] arr){int[] bucket=new int[1000];for (int value:arr) {bucket[value]++;}for (int i = 0; i < bucket.length; i++) {for (int j = 0; j < bucket[i]; j++) {System.out.print(i+" ");}}}/*** 桶排序(基数排序) <br>* 1、首先准备10个队列,将队列放入集合中 <br>* 2、找到数组最大元素的位数 <br>* 3、循环最大元素的位数次,第i次循环,则将数组元素的第i位放入对应索引的队列中,全部放完后,再按顺序取出 <br>* @param arr int[]* @param left int* @param right int* @param maxBits int*/public static void radixSort(int[] arr,int left,int right,int maxBits){ArrayList<ArrayBlockingQueue<Integer>> bucket = new ArrayList<>();for (int i = 0; i < 10; i++) {bucket.add(new ArrayBlockingQueue<Integer>(arr.length));}for (int i = 0; i < maxBits; i++) {for (int j = left; j <= right; j++) {bucket.get((int)((arr[j]%(Math.pow(10,(i+1))))/(Math.pow(10,i)))).add(arr[j]);}int j=left;for (int k = 0; k < 10; k++) {while (bucket.get(k).size()>0){arr[j++]=bucket.get(k).poll();}}}}/*** 桶排序(基数排序) (优化空间) <br>* 1、首先准备长度为10的计数数组 <br>* 2、找到数组最大元素的位数 <br>* 3、第i次循环,则将数组元素的第i位对应的计数数组加一 <br>* 4、对计数数组做一个前缀和 <br>* 5、准备temp数组,长度为要排序的长度 <br>* 6、从右向左遍历原数组,元素的第i位值对应的计数数组的值即为在temp数组的位置,放入后再减一 <br>* 7、清空计数数组 <br>* 8、循环3、4、5、6、7步骤最大元素位数次* @param arr int[]* @param left int* @param right int* @param maxBits int*/public static void radixSortOptimized(int[] arr,int left,int right,int maxBits){// 中转数组int[] temp=new int[arr.length];// 计数数组int[] count=new int[10];for (int i = 0; i < maxBits; i++) {for (int j = left; j <= right; j++) {count[(int)((arr[j]%(Math.pow(10,(i+1))))/(Math.pow(10,i)))]++;}for (int j = 1; j < 10; j++) {count[j]+=count[j-1];}for (int j = right; j >=left ; j--) {int index=(int)((arr[j]%(Math.pow(10,(i+1))))/(Math.pow(10,i)));count[index]--;temp[count[index]+left]=arr[j];}for (int j = left; j <= right; j++) {arr[j]=temp[j];}// 清空计数数组for (int j = 0; j < 10; j++) {count[j]=0;}}}/*** 求数组元素最大值的位数* @param arr int[]* @return int*/public static int maxBits(int[] arr){int maxValue = Integer.MIN_VALUE;for (int k:arr) {maxValue=Math.max(maxValue,k);}int maxBits=0;while (maxValue>0){maxValue/=10;maxBits++;}return maxBits;}/*** 交换* @param arr int[]* @param i int* @param j int*/public static void swap(int[] arr,int i,int j){if (i==j){return;}arr[i]=arr[i]^arr[j];arr[j]=arr[i]^arr[j];arr[i]=arr[i]^arr[j];}/*** 打印数组元素* @param arr int[]*/public static void printArr(int[] arr){for (int j : arr) {System.out.print(j + " ");}System.out.println();}public static void main(String[] args) {int[] arr={1,10,9,5,8,3,2,2};
//        radixSort(arr,0,arr.length-1,maxBits(arr));
//        printArr(arr);radixSortOptimized(arr,2,arr.length-3,maxBits(arr));printArr(arr);
//
//        int maxSize=1000;
//        int maxValue=100000;
//        int maxN=10000;
//        for (int i = 0; i < maxN; i++) {
//            int[] arr = getArr(maxSize, maxValue);
//            int[] arr1 = Arrays.copyOf(arr,arr.length);
//            radixSortOptimized(arr,0,arr.length-1,maxBits(arr));
//            systemSort(arr1);
//            for (int j = 0; j < arr.length; j++) {
//                if (arr[j]!=arr1[j]){
//                    System.out.println("Error");
//                    return;
//                }
//            }
//        }
//        System.out.println("Right");//        radixSort(arr,0,arr.length-1,maxBits(arr));
//        printArr(arr);
//        int[] temp=Arrays.copyOf(arr,arr.length);
//        heapSort(arr);
//        printArr(arr);
//        heapSortNotOutK(temp,5);
//        printArr(temp);
//
//        int heapSize=arr.length;
//        for (int i = (heapSize-1)/2; i >=0 ; i--) {
//            heapify(arr,i,heapSize);
//        }
//        int[] arr1 = addHeap(arr, 11);
//        for (int j : arr1) {
//            System.out.print(j + " ");
//        }//        // 定制大根堆
//        PriorityQueue<Integer> heap = new PriorityQueue<>(new MyComparator());
//        for (int k:arr) {
//            heap.add(k);
//        }
//        while (heap.size()>0){
//            System.out.print(heap.poll()+" ");
//        }//        countSort(arr);}
}
Heap sort, bucket sort, priority queue, comparator

算法学习左神第三节课相关推荐

  1. 风炫安全Web安全学习第四十三节课 路径遍历漏洞

    风炫安全Web安全学习第四十三节课 路径遍历漏洞 路径遍历 0x01 漏洞概述 路径遍历攻击(也称作目录遍历)的目标是访问web根目录外存储的文件和目录.通过操纵使用"点-斜线(-/)&qu ...

  2. 学习Python的第三节课

    学习Python的第三节课 1.数据类型之字符串 (1)字符串创建 单引号:字符串变量名='字符串数据' 双引号:字符串变量名="字符串数据" 三引号:字符串变量名='''字符串数 ...

  3. 学习python的第三节课:基础数据

    文章目录 一.几个概念 1.1 表达式 1.2 语句 1.3 程序(program) 1.4 函数(function) 二.数据类型 2.1 什么是程序 2.2 数据类型 2.3 算法 三.pytho ...

  4. 学习python的第三节课:字符串

    文章目录 一.python字符串(str)概念 1.1 字符串特征 1.2 字符串输出 1.3 字符串输入 二.转义字符 2.1 什么是转义字符 2.2 转义字符的实际应用 2.2.1单引号,双引号在 ...

  5. 【图】Dijkstra(迪杰特斯拉)算法、左神Java版

    什么是Dijkstra 给定一个图,从某点出发到达某点给出最短的路径 比如上述图,从A出发,到其余点的最短路径,返回这样的表 思路 我们先用一个表格记录A到其余点的距离,初始值是A到A的距离为0,与其 ...

  6. 2021算法竞赛入门班第三节课【堆、栈、队列、并查集】等习题

    目录 新建 Microsoft Office Word 文档[小根堆] 加边的无向图[并查集] 好串[栈 / 括号匹配] [NOIP2004]合并果子[小根堆] DongDong认亲戚[并查集] 新建 ...

  7. 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记

    一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...

  8. 左神数据结构与算法 笔记(二)

    文章目录 第七节课 1.二叉树 1.1.二叉树的先序.中序.后序遍历 1.2二叉树的按层遍历 二叉树的最大宽度: 1.3二叉树的序列化和反序列化 第八节课 1.题目一 2.题目二 3.折纸 4.二叉树 ...

  9. 左神讲算法——二分法及其拓展

    目录 1. 经典二分例题 2. 拓展例题一:寻找大于等于某数最左侧位置 3. 拓展例题二:局部最小值问题 参考链接:2021最新左神数据结构算法全家桶 1. 经典二分例题 题目一:在一个有序数组中,找 ...

最新文章

  1. .net 使用 Aspose.Words 进行 Word替换操作
  2. asp.net学习笔记·将数据库中的数据保存在EXCEL文件中
  3. asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...
  4. CPU 的 ring0、ring1、ring2、ring3
  5. 【ArcGIS遇上Python】ArcGIS Python将多个文件夹内的分幅数据整合到同一个文件夹内——以Globeland30数据为例
  6. Win11将沿用Win10升级模式 并会有LTSC版本
  7. 信息学奥赛C++语言:社会实践任务
  8. 深入理解HTTP协议、HTTP协议原理分析【转】
  9. Android 系统(70)---Android刘海屏适配方案
  10. THD 变量存入threads中
  11. Java中udp/tcp的发送和接收
  12. 抽象类、接口作为方法返回值和参数
  13. RtlZeroMemory
  14. java网上在线考试系统代码_Java+JavaWeb在线考试系统
  15. servlet mysql jsp视频_jsp+servlet+mysql实现的在线图书商城源码附带视频指导运行教程...
  16. oracle算加权平均的函数,EXCEL中用公式算加权平均值
  17. katana工程搭建以及模型相机的导入
  18. 【喜讯 · 喜讯】讲师自营销计划奖励又双叒叕来了!
  19. 英语绕口令(转)[Blog synchronous]
  20. DataGrip连接MySQL报错: Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon

热门文章

  1. 黄金自己怎么用计算计算机数,二 备课 泰山黄金周计算器.doc
  2. 算法:三数之和(js)
  3. iPhone1.1.4固件破解详细教程(Mac版)
  4. 无法启动服务,原因可能是已被禁用或与其他关联的设备没有启动
  5. 【python】解析中英文进阶
  6. 命令行进入mysql
  7. PHP数组排序二维数组排序
  8. python如何自动生成流程图
  9. 正则匹配html中url,JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
  10. [网络安全提高篇] 一一八.恶意软件静态分析经典工具Capa批量提取静态特征和ATTCK技战术