算法学习左神第三节课
堆排序、桶排序、优先级队列、比较器
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);}
}
算法学习左神第三节课相关推荐
- 风炫安全Web安全学习第四十三节课 路径遍历漏洞
风炫安全Web安全学习第四十三节课 路径遍历漏洞 路径遍历 0x01 漏洞概述 路径遍历攻击(也称作目录遍历)的目标是访问web根目录外存储的文件和目录.通过操纵使用"点-斜线(-/)&qu ...
- 学习Python的第三节课
学习Python的第三节课 1.数据类型之字符串 (1)字符串创建 单引号:字符串变量名='字符串数据' 双引号:字符串变量名="字符串数据" 三引号:字符串变量名='''字符串数 ...
- 学习python的第三节课:基础数据
文章目录 一.几个概念 1.1 表达式 1.2 语句 1.3 程序(program) 1.4 函数(function) 二.数据类型 2.1 什么是程序 2.2 数据类型 2.3 算法 三.pytho ...
- 学习python的第三节课:字符串
文章目录 一.python字符串(str)概念 1.1 字符串特征 1.2 字符串输出 1.3 字符串输入 二.转义字符 2.1 什么是转义字符 2.2 转义字符的实际应用 2.2.1单引号,双引号在 ...
- 【图】Dijkstra(迪杰特斯拉)算法、左神Java版
什么是Dijkstra 给定一个图,从某点出发到达某点给出最短的路径 比如上述图,从A出发,到其余点的最短路径,返回这样的表 思路 我们先用一个表格记录A到其余点的距离,初始值是A到A的距离为0,与其 ...
- 2021算法竞赛入门班第三节课【堆、栈、队列、并查集】等习题
目录 新建 Microsoft Office Word 文档[小根堆] 加边的无向图[并查集] 好串[栈 / 括号匹配] [NOIP2004]合并果子[小根堆] DongDong认亲戚[并查集] 新建 ...
- 一周刷爆LeetCode,算法da神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解 笔记 教程与代码地址 P1 出圈了!讲课之外我们来聊聊 ...
- 左神数据结构与算法 笔记(二)
文章目录 第七节课 1.二叉树 1.1.二叉树的先序.中序.后序遍历 1.2二叉树的按层遍历 二叉树的最大宽度: 1.3二叉树的序列化和反序列化 第八节课 1.题目一 2.题目二 3.折纸 4.二叉树 ...
- 左神讲算法——二分法及其拓展
目录 1. 经典二分例题 2. 拓展例题一:寻找大于等于某数最左侧位置 3. 拓展例题二:局部最小值问题 参考链接:2021最新左神数据结构算法全家桶 1. 经典二分例题 题目一:在一个有序数组中,找 ...
最新文章
- .net 使用 Aspose.Words 进行 Word替换操作
- asp.net学习笔记·将数据库中的数据保存在EXCEL文件中
- asp.net gridview删除 获取到第一行第一列的单元格内容_VBA中的常用单元格引用方式...
- CPU 的 ring0、ring1、ring2、ring3
- 【ArcGIS遇上Python】ArcGIS Python将多个文件夹内的分幅数据整合到同一个文件夹内——以Globeland30数据为例
- Win11将沿用Win10升级模式 并会有LTSC版本
- 信息学奥赛C++语言:社会实践任务
- 深入理解HTTP协议、HTTP协议原理分析【转】
- Android 系统(70)---Android刘海屏适配方案
- THD 变量存入threads中
- Java中udp/tcp的发送和接收
- 抽象类、接口作为方法返回值和参数
- RtlZeroMemory
- java网上在线考试系统代码_Java+JavaWeb在线考试系统
- servlet mysql jsp视频_jsp+servlet+mysql实现的在线图书商城源码附带视频指导运行教程...
- oracle算加权平均的函数,EXCEL中用公式算加权平均值
- katana工程搭建以及模型相机的导入
- 【喜讯 · 喜讯】讲师自营销计划奖励又双叒叕来了!
- 英语绕口令(转)[Blog synchronous]
- DataGrip连接MySQL报错: Server returns invalid timezone. Go to ‘Advanced‘ tab and set ‘serverTimezon
热门文章
- 黄金自己怎么用计算计算机数,二 备课 泰山黄金周计算器.doc
- 算法:三数之和(js)
- iPhone1.1.4固件破解详细教程(Mac版)
- 无法启动服务,原因可能是已被禁用或与其他关联的设备没有启动
- 【python】解析中英文进阶
- 命令行进入mysql
- PHP数组排序二维数组排序
- python如何自动生成流程图
- 正则匹配html中url,JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
- [网络安全提高篇] 一一八.恶意软件静态分析经典工具Capa批量提取静态特征和ATTCK技战术