23章 排序

1.编写程序,分别使用ComparableComparator接口对元素冒泡排序。

import java.util.Comparator;public class MySort {public static <E extends Comparable<E>> void bubbleSort(E[] list) {boolean needNextPass = true;for (int i = 1; needNextPass && i < list.length; i++) {needNextPass = false;for (int j = 0; j < list.length - i; j++)if (list[j].compareTo(list[j + 1]) > 0) {E t = list[j];list[j] = list[j + 1];list[j + 1] = t;needNextPass = true;}}}public static <E> void bubbleSort(E[] list, Comparator<? super E> comparator) {boolean needNextPass = true;for (int i = 1; needNextPass && i < list.length; i++) {needNextPass = false;for (int j = 0; j < list.length - i; j++)if (comparator.compare(list[j], list[j + 1]) > 0) {E t = list[j];list[j] = list[j + 1];list[j + 1] = t;needNextPass = true;}}}
}

2.编写程序,分别使用ComparableComparator接口对元素归并排序。

import java.util.Comparator;public class MySort {public static <E extends Comparable<E>> void mergeSort(E[] list) {new MergeSort<>(list, new Comparator<E>() {@Overridepublic int compare(E o1, E o2) {return o1.compareTo(o2);}}).sort();}public static <E> void mergeSort(E[] list, Comparator<? super E> comparator) {new MergeSort<>(list, comparator).sort();}
}class MergeSort<E> {private E[] list;private E[] tmp;private Comparator<? super E> comparator;public MergeSort(E[] list, Comparator<? super E> comparator) {this.list = list;tmp = (E[]) new Object[list.length];this.comparator = comparator;}// 排序范围 [start, end)private void sort(int start, int end) {if (end < start + 2) return;int m = (start + end) >> 1;sort(start, m);sort(m, end);int i = start, j = m, r = 0;while (i < m && j < end)if (comparator.compare(list[i], list[j]) < 0)tmp[r++] = list[i++];elsetmp[r++] = list[j++];while (i < m) tmp[r++] = list[i++];while (j < end) tmp[r++] = list[j++];System.arraycopy(tmp, 0, list, start, r);}public void sort() {sort(0, list.length);}
}

3.编写程序,分别使用ComparableComparator接口对元素快速排序。

import java.util.Comparator;public class MySort {public static <E extends Comparable<E>> void quickSort(E[] list) {new QuickSort<>(list, new Comparator<E>() {@Overridepublic int compare(E o1, E o2) {return o1.compareTo(o2);}}).sort(0, list.length);}public static <E> void quickSort(E[] list, Comparator<? super E> comparator) {new QuickSort<>(list, comparator).sort(0, list.length);}
}class QuickSort<E> {private E[] list;private Comparator<? super E> comparator;public QuickSort(E[] list, Comparator<? super E> comparator) {this.list = list;this.comparator = comparator;}// 排序范围 [start, end)public void sort(int start, int end) {if (end < start + 2) return;if (end == start + 2) {if (comparator.compare(list[start], list[start + 1]) > 0) {E e = list[start];list[start] = list[start + 1];list[start + 1] = e;}return;}E e = list[start];int l = start + 1, r = end - 1;for (; ; ) {while (l <= r && comparator.compare(list[l], e) <= 0) ++l;while (l <= r && comparator.compare(list[r], e) > 0) --r;if (r > l) {E t = list[r];list[r] = list[l];list[l] = t;} elsebreak;}while (r > start && comparator.compare(list[r], e) >= 0) --r;if (comparator.compare(e, list[r]) > 0) {list[start] = list[r];list[r] = e;sort(start, r);sort(r + 1, end);} elsesort(start + 1, end);}
}

6.编写下面的重载方法,用于检查数组是按升序还是降序排序的。默认情况下,该方法是检查升序的。为检查降序,则将false传递给方法中的ascending参数。

6

import java.util.Comparator;public class OrderChecker {public static boolean ordered(int[] list) {int n = list.length - 1;for (int i = 0; i < n; i++)if (list[i] > list[i + 1])return false;return true;}public static boolean ordered(int[] list, boolean ascending) {int n = list.length - 1;if (ascending) {for (int i = 0; i < n; i++)if (list[i] > list[i + 1])return false;} elsefor (int i = 0; i < n; i++)if (list[i] < list[i + 1])return false;return true;}public static boolean ordered(double[] list) {int n = list.length - 1;for (int i = 0; i < n; i++)if (list[i] > list[i + 1])return false;return true;}public static boolean ordered(double[] list, boolean ascending) {int n = list.length - 1;if (ascending) {for (int i = 0; i < n; i++)if (list[i] > list[i + 1])return false;} elsefor (int i = 0; i < n; i++)if (list[i] < list[i + 1])return false;return true;}public static <E extends Comparable<E>> boolean ordered(E[] list) {int n = list.length - 1;for (int i = 0; i < n; i++)if (list[i].compareTo(list[i + 1]) > 0)return false;return true;}public static <E extends Comparable<E>> boolean ordered(E[] list, boolean ascending) {int n = list.length - 1;if (ascending) {for (int i = 0; i < n; i++)if (list[i].compareTo(list[i + 1]) > 0)return false;} elsefor (int i = 0; i < n; i++)if (list[i].compareTo(list[i + 1]) < 0)return false;return true;}public static <E> boolean ordered(E[] list, Comparator<? super E> comparator) {int n = list.length - 1;for (int i = 0; i < n; i++)if (comparator.compare(list[i], list[i + 1]) > 0)return false;return true;}public static <E> boolean ordered(E[] list, Comparator<? super E> comparator, boolean ascending) {int n = list.length - 1;if (ascending) {for (int i = 0; i < n; i++)if (comparator.compare(list[i], list[i + 1]) > 0)return false;} elsefor (int i = 0; i < n; i++)if (comparator.compare(list[i], list[i + 1]) < 0)return false;return true;}
}

7.修改程序清单23-9中的Heap类以实现最小堆(每个节点都小于等于它的任何一个子节点)。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;public class Heap<E> {private ArrayList<E> list;private Comparator<? super E> comparator;public Heap(Comparator<? super E> comparator) {this.comparator = comparator;list = new ArrayList<>();}public Heap() {comparator = (e1, e2) -> ((Comparable<E>) e1).compareTo(e2);list = new ArrayList<>();}public Heap(E[] objects) {comparator = (e1, e2) -> ((Comparable<E>) e1).compareTo(e2);list = new ArrayList<>(List.of(objects));}public void add(E newObject) {int currentIndex = list.size();list.add(newObject);while (currentIndex > 0) {int parentIndex = (currentIndex - 1) >> 1;if (comparator.compare(list.get(currentIndex), list.get(parentIndex)) < 0) {E t = list.get(currentIndex);list.set(currentIndex, list.get(parentIndex));list.set(parentIndex, t);} elsebreak;currentIndex = parentIndex;}}public E remove() {if (list.isEmpty()) return null;E removedObject = list.getFirst();list.set(0, list.getLast()); // 这里不能写成list.set(0, list.removeLast());list.removeLast();int currentIndex = 0, n = list.size();while (currentIndex < n) {int leftChildIndex = (currentIndex << 1) + 1, rightChildIndex = leftChildIndex + 1;if (leftChildIndex >= n) break;int minIndex = leftChildIndex;if (rightChildIndex < n && comparator.compare(list.get(minIndex), list.get(rightChildIndex)) > 0)minIndex = rightChildIndex;if (comparator.compare(list.get(currentIndex), list.get(minIndex)) > 0) {E t = list.get(minIndex);list.set(minIndex, list.get(currentIndex));list.set(currentIndex, t);currentIndex = minIndex;} elsebreak;}return removedObject;}public int size() {return list.size();}public boolean isEmpty() {return list.isEmpty();}
}

8.编写程序,分别使用ComparableComparator接口对元素插入排序。

import java.util.Comparator;public class MySort {public static <E extends Comparable<E>> void insertionSort(E[] list) {for (int i = 1; i < list.length; i++) {E currentElement = list[i];int k = i;while (--k >= 0 && list[k].compareTo(currentElement) > 0) list[k + 1] = list[k];list[k + 1] = currentElement;}}public static <E> void insertionSort(E[] list, Comparator<E> comparator) {for (int i = 1; i < list.length; i++) {E currentElement = list[i];int k = i;while (--k >= 0 && comparator.compare(list[k], currentElement) > 0) list[k + 1] = list[k];list[k + 1] = currentElement;}}
}

9.编写程序,分别使用ComparableComparator接口对元素堆排序。

import java.util.Comparator;// 这里的Heap类是第7题中的
public class MySort {public static <E extends Comparable<E>> void heapSort(E[] list) {Heap<E> heap = new Heap<>();for (E e : list) heap.add(e);for (int i = 0; i < list.length; i++) list[i] = heap.remove();}public static <E> void heapSort(E[] list, Comparator<E> comparator) {Heap<E> heap = new Heap<>(comparator);for (E e : list) heap.add(e);for (int i = 0; i < list.length; i++) list[i] = heap.remove();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146939.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

困扰霍金和蔡磊等人的渐冻症,能否在医学AI领域寻找到下一个解决方案?|个人观点·24-09-22

小罗碎碎念 前沿探索&#xff1a;医学AI在渐冻症&#xff08;Amyotrophic Lateral Sclerosis&#xff0c;ALS&#xff09;领域的研究进展 老粉都知道&#xff0c;小罗是研究肿瘤的&#xff0c;之前的推文也几乎都是探索医学AI在肿瘤领域的研究进展。 在查阅资料的时候&#xf…

跟着问题学12——GRU详解

1 GRU 1. 什么是GRU GRU&#xff08;Gate Recurrent Unit&#xff09;是循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的一种。和LSTM&#xff08;Long-Short Term Memory&#xff09;一样&#xff0c;也是为了解决长期记忆 和反向传播中的梯度等问题…

设计模式之结构型模式例题

答案&#xff1a;A 知识点 创建型 结构型 行为型模式 工厂方法模式 抽象工厂模式 原型模式 单例模式 构建器模式 适配器模式 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式 模板方法模式 职责链模式 命令模式 迭代器模式 中介者模式 解释器模式 备忘录模式 观…

如何在jupyter notebook中使用虚拟环境

一&#xff1a;在cmd中打开已经创建好的虚拟环境 二&#xff1a;安装ipykernel conda install ipykernel 三&#xff1a;安装牛逼conda conda install -c conda-forge nb_conda 四&#xff1a;运行jupyter notebook,选择虚拟环境

带你0到1之QT编程:十七、Http协议实战,实现一个简单服务器和一个客户端进行http协议通信

此为QT编程的第十七谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

SSM+vue音乐播放器管理系统

音乐播放器管理系统 随着社会的发展&#xff0c;计算机的优势和普及使得音乐播放器管理系统的开发成为必需。音乐播放器管理系统主要是借助计算机&#xff0c;通过对首页、音乐推荐、付费音乐、论坛信息、个人中心、后台管理等信息进行管理。减少管理员的工作&#xff0c;同时…

基于微信小程序的家教信息管理系统的设计与实现(论文+源码)_kaic

摘 要 随着互联网时代的来临&#xff0c;使得传统的家教模式已不复存在&#xff0c;亟需一种方便、快捷的在线教学平台。因此&#xff0c;利用Java语言作为支撑和MySQL数据库存储数据&#xff0c;结合微信小程序的便利性&#xff0c;为用户开发出了一个更加人性化、方便的家庭…

uniapp 整合 OpenLayer3

安装openLayer插件 命令行&#xff1a;npm install ol 安装sass插件 命令行&#xff1a;npm install -D sass 使用方法&#xff1a; *** *** <style scoped lang"scss"> </style> 安装ElementPlus 命令行&#xff1a;npm install element-plus -…

【宝藏案例篇!】不在同一局域网怎么远程桌面?实现远程桌面访问的3种方法推荐

不在同一局域网怎么远程桌面&#xff1f;当两台电脑不在同一局域网时&#xff0c;实现远程桌面访问可以通过多种方法。 以下是三种推荐的方法&#xff0c;以及每种方法的详细步骤和注意事项&#xff1a; 方法一&#xff1a;使用第三方远程控制软件 选择一款可靠的第三方远程控…

18938 汉诺塔问题

### 思路 1. **递归解决问题**&#xff1a;使用递归方法解决汉诺塔问题。 2. **递归基准**&#xff1a;当只有一个盘子时&#xff0c;直接从源杆移动到目标杆。 3. **递归步骤**&#xff1a; - 将n-1个盘子从源杆移动到辅助杆。 - 将第n个盘子从源杆移动到目标杆。 - …

JavaScript二进制浮点数和四舍五入错误

二进制浮点数和四舍五入错误 实数有无数个&#xff0c;但JS通过浮点数的形式&#xff0c;只能表示有限个数&#xff0c;JS表现的常常是真实值的近似表示。 二进制无法表示类似于0.1这样的十进制数字&#xff0c;只能机器近似于0.1&#xff0c;看如下代码&#xff1a; <!D…

Python 中的方法解析顺序(MRO)

在 Python 中&#xff0c;MRO&#xff08;Method Resolution Order&#xff0c;方法解析顺序&#xff09;是指类继承体系中&#xff0c;Python 如何确定在调用方法时的解析顺序。MRO 决定了在多继承环境下&#xff0c;Python 如何寻找方法或属性&#xff0c;即它会根据一定规则…

二,MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明)

二&#xff0c;MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明) 文章目录 二&#xff0c;MyBatis -Plus 关于映射 Java Bean 对象的注意事项和细节(详细说明)1. 映射2. 表的映射3. 字段映射4. 字段失效5. 视图属性6. 总结&#xff1a;7. 最后&#xff1a; 1.…

【数据优化】基于GEE填补遥感缺失数据

GEE填补遥感数据缺失 1.写在前面2.填充代码2.1 年内中值数据填充MODIS NPP空值2.2 年内中值数据填充Landsat8 NDVI空值 1.写在前面 在遥感影像分析中&#xff0c;我们经常会遇到由于云层遮挡、传感器故障等多重因素导致的图像数据缺失问题。为了解决这一挑战&#xff0c;常用的…

Selenium with Python学习笔记整理(网课+网站持续更新)

本篇是根据学习网站和网课结合自己做的学习笔记&#xff0c;后续会一边学习一边补齐和整理笔记 官方学习网站在这获取&#xff1a; https://selenium-python.readthedocs.io/getting-started.html#simple-usage WEB UI自动化环境配置 (推荐靠谱的博客文章来进行环境配置,具…

MySQL高阶之存储过程

什么是存储过程? 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。 换句话说&#xff0c;存储过程其实…

Acwing BFS

一般通过队列实现&#xff0c;当边的权值相同时具有最短性&#xff0c;可以求最少操作步数。相比DFS无需回溯&#xff0c;而是逐层搜索。 Acwing 844 走迷宫 输入样例&#xff1a; 5 5 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 输出样例&#xff1a; 8 思路分析&am…

Spring Boot蜗牛兼职网:全栈开发

第4章 系统设计 4.1 系统体系结构 蜗牛兼职网的结构图4-1所示&#xff1a; 图4-1 系统结构 登录系统结构图&#xff0c;如图4-2所示&#xff1a; 图4-2 登录结构图 蜗牛兼职网结构图&#xff0c;如图4-3所示。 图4-3 蜗牛兼职网结构图 4.2开发流程设计 系统流程的分析是通…

[今日Arxiv] 思维迭代:利用内心对话进行自主大型语言模型推理

思维迭代&#xff1a;利用内心对话进行自主大型语言模型推理 Iteration of Thought: Leveraging Inner Dialogue for Autonomous Large Language Model Reasoning URL&#xff1a;https://arxiv.org/abs/2409.12618 注&#xff1a;翻译可能存在误差&#xff0c;详细内容建议…

Java -2

常用API System 可以获取当前时间&#xff0c;以此计算运行代码的时间也可以控制代码的结束 //获取当前时间点-毫秒 1970 1-1 8:00 long num System.currentTimeMillis(); System.out.println(num);//系统退出运行 System.exit(0); Runtime 获取操作系统的线程大小 能从操…