Java希尔排序知识点(含面试大厂题和源码)

希尔排序(Shell Sort)是插入排序的一种改进版本,也被称为“缩小增量排序”。它是由IBM的研究员Donald Shell于1959年提出的。希尔排序的核心思想是将原始数据集分割成若干个子序列,每个子序列由相隔一定增量的元素组成,然后对这些子序列分别进行插入排序。随着增量逐渐减小,整个数据集最终变为有序。

希尔排序的工作原理:

  1. 选择增量序列:增量序列的选择对希尔排序的性能有很大影响。常见的增量序列有希尔原始序列(N/2,N/4,…,1),Hibbard增量序列(1, 3, 7, …, 2^k - 1),Knuth序列(1, 4, 13, …, (3^k - 1)/2)等。
  2. 分组插入排序:按照当前增量将数组分为若干子序列,并对每个子序列进行插入排序。
  3. 减小增量,重复排序:减小增量值,并重复上述步骤,直到增量为1,此时进行最后一次插入排序,此时数组已经基本有序,所以最后一次插入排序会非常快。

希尔排序的优缺点:

优点

  • 希尔排序的时间复杂度在最坏情况下可以达到 O(n^(3/2)),但实际应用中往往表现得更好,接近 O(n log n)。
  • 希尔排序是不稳定的排序算法,原数组中相等元素的顺序可能会发生改变。

缺点

  • 希尔排序需要额外的存储空间,空间复杂度为 O(1)。
  • 希尔排序的性能依赖于增量序列的选择,不同的增量序列可能导致性能差异较大。

希尔排序的Java实现:

public class ShellSort {public void shellSort(int[] arr) {if (arr == null || arr.length == 0) {return;}int n = arr.length;for (int gap = n / 2; gap > 0; gap /= 2) {// 从第gap个元素开始,逐个对其所在子序列进行直接插入排序for (int i = gap; i < n; i++) {for (int j = i; j >= gap; j -= gap) {if (arr[j] < arr[j - gap]) {// 交换arr[j]和arr[j-gap]int temp = arr[j];arr[j] = arr[j - gap];arr[j - gap] = temp;} else {break;}}}}}public static void main(String[] args) {ShellSort shellSort = new ShellSort();int[] arr = {12, 34, 54, 2, 3};shellSort.shellSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

在面试中,了解希尔排序的原理和实现是非常重要的,尤其是增量序列的选择对算法性能的影响。希尔排序是非比较排序算法中的一种,它的平均时间复杂度比插入排序和冒泡排序要好,但在最坏情况下仍然不如快速排序、归并排序和堆排序。希尔排序作为一种有效的排序算法,虽然在现代编程实践中使用频率不如快速排序、归并排序等,但它的原理和实现仍然是面试中的重要知识点。以下是三道与希尔排序相关的面试题目,以及相应的Java源码实现。

题目 1:数组中的第K大元素

描述
给定一个未排序的整数数组和一个整数 k,找出数组中的第 k 个最大的元素。

示例

输入: [3, 2, 1, 5, 6, 4], k = 2
输出: 5

Java 源码

import java.util.Arrays;public class FindKthLargest {public int findKthLargest(int[] nums, int k) {Arrays.sort(nums);return nums[nums.length - k];}public static void main(String[] args) {FindKthLargest solution = new FindKthLargest();int[] nums = {3, 2, 1, 5, 6, 4};int k = 2;int result = solution.findKthLargest(nums, k);System.out.println("The " + k + "th largest element is: " + result);}
}

题目 2:通过希尔排序优化的数组合并

描述
有两个有序的整数数组,数组一不能直接进行修改,数组二可以进行修改,请你将数组一合并到数组二中,使得合并后的数组二也是有序的。

示例

输入: 1st array: [1, 3, 5], 2nd array: [2, 4, 6]
输出: [1, 2, 3, 4, 5, 6]

Java 源码

public class MergeSortedArrays {public void merge(int[] nums1, int m, int[] nums2, int n) {int i = 0, j = 0, k = 0;while (i < m && j < n) {if (nums1[i] < nums2[j]) {nums1[k++] = nums1[i++];} else {nums1[k++] = nums2[j++];}}while (i < m) {nums1[k++] = nums1[i++];}while (j < n) {nums1[k++] = nums2[j++];}}public static void main(String[] args) {MergeSortedArrays solution = new MergeSortedArrays();int[] nums1 = {1, 3, 5};int m = 3;int[] nums2 = {2, 4, 6};int n = 3;solution.merge(nums1, m, nums2, n);System.out.println("The merged array is: " + Arrays.toString(nums1));}
}

题目 3:希尔排序优化的计数排序

描述
给定一个整数数组,其中元素的取值范围是 0 到 k,设计一个空间复杂度为 O(n+k) 的计数排序算法。

示例

输入: nums = [0, 1, 2, 2, 3, 4], k = 4
输出: [0, 1, 2, 2, 3, 4]

Java 源码

public class OptimizedCountingSort {public void optimizedCountingSort(int[] nums, int k) {int[] count = new int[k + 1];for (int num : nums) {count[num]++;}int index = 0;for (int i = 0; i <= k; i++) {for (int j = 0; j < count[i]; j++) {nums[index++] = i;}}}public static void main(String[] args) {OptimizedCountingSort solution = new OptimizedCountingSort();int[] nums = {0, 1, 2, 2, 3, 4};int k = 4;solution.optimizedCountingSort(nums, k);System.out.println("Sorted array: " + Arrays.toString(nums));}
}

这些题目和源码展示了希尔排序和其他排序算法在解决实际问题时的应用。在面试中,能够根据问题的特点选择合适的算法并实现其解决方案是非常重要的。希望这些示例能够帮助你更好地准备面试!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[LeetCode][400]第 N 位数字

题目 400. 第 N 位数字 给你一个整数 n &#xff0c;请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;n 11 输出&#xff1a;…

java算法汇总(蓝桥常用-->自总版)(更新中...)

这里写目录标题 1.递归求n的阶乘2.互质3.例题:奇妙的数字两个数字拼接String.toCharArray()方法String.valueOf()方法 4.例题:美丽的2String.contains()方法 5.ASCII码---a,A,0的转换6.String[] a---->求sum(a[p].charAt(q))-0;7.复数BigInteger 大整数类型本题用到的方法--…

Sora是否能颠覆视频制作行业?一文带你了解

一个月前OpenAI宣布了一款名为Sora的新生成式人工智能系统&#xff0c;该系统可以根据文本提示生成短视频。虽然Sora尚未向公众开放&#xff0c;但迄今为止发布的高质量样本已经引起了兴奋和担忧的反应。 OpenAI发布的样本视频&#xff08;该公司称这些视频是由Sora直接制作&am…

Python学习笔记-简单案例实现多进程与多线程

Python 的多进程与多线程是并发编程的两种重要方式&#xff0c;用于提高程序的执行效率。它们各自有不同的特点和适用场景。 多进程&#xff08;Multiprocessing&#xff09; 概念&#xff1a; 多进程是指操作系统中同时运行多个程序实例&#xff0c;每个实例称为一个进程。…

表单元素使用

表单元素使用 要完成的效果:代码实现: 要完成的效果: 代码实现: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

完整部署一套k8s-v.1.28.0版本的集群

一、系统情况 虚拟机版本&#xff1a;esxi 6.7 系统版本&#xff1a;centos7.9_2009_x86 配置&#xff1a;4核8G&#xff08;官网最低要求2核2G&#xff09; 192.168.0.137 master节点 192.168.0.139 node2节点 192.168.0.138 node1节点&#xff08;节点扩容练习&#xf…

Spring Cloud_Spring Cloud Alibaba_00000

版本选择 Spring Boot版本选择 Spring Boot github源码地址&#xff1a;https://github.com/spring-projects/spring-boot/releases/ Spring Boot github地址&#xff1a;https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes Spring Cloud g…

DataX 源码改造支持Mysql 8.X

文章目录 DataX 源码改造支持Mysql 8.X问题背景克隆源代码并修改重新打包生产环境发布DataX 源码改造支持Mysql 8.X 问题背景 今天在使用DataX同步数据的时候遇到一个问题,报错如下 错误信息为:java.sql.SQLException: No suitable driver found for ["jdbc:mysql://…

Java-常见面试题收集(七)

十四 MySQL 1 MySQL 支持的存储引擎 MySQL 支持多种存储引擎&#xff0c;常见的有2种&#xff0c;你可以通过 show engines 命令来查看 MySQL 支持的所有存储引擎。MySQL 当前默认的存储引擎是 InnoDB。并且&#xff0c;所有的存储引擎中只有 InnoDB 是事务性存储引擎&#xf…

==和equals的区别【大白话Java面试题】

和equals的区别 大白话回答 的作用&#xff1a;   基本类型&#xff1a;比较的就是值是否相同   引用类型&#xff1a;比较的就是地址值是否相同 equals 的作用:   引用类型&#xff1a;默认情况下&#xff0c;比较的是地址值。 注&#xff1a;不过&#xff0c;我们可以…

在axios中设置方法防止http重复请求

可以在封装的 Axios 中设置方法来防止 HTTP 的重复请求。一种常见的方法是通过设置一个标识符&#xff0c;在发送请求前检查该标识符&#xff0c;如果之前已经有相同的请求正在进行&#xff0c;则取消当前请求或者等待上一个请求完成后再发送新请求。这种方式可以有效地避免重复…

CCF考级 1-8级考纲知识点

CCF考级 C 一级考纲知识内容计算机基础知识集成开发环境结构化程序设计程序的基本语句程序的基本概念基本运算基本数据类型 C 二级考纲知识内容计算机存储与网络程序设计语言流程图ASCII 编码数据类型转换多层分支/循环结构数学函数 C 三级考纲知识内容数据编码进制转换位运算算…

On Java8读书笔记

Housekeeping Unsafe programming is one of the major culprits that makes programming expensive 使用构造器确保初始化 初始化数据是一个相当重要但是常常容易忘记的事&#xff0c;但是作为一个程序员&#xff0c;你也不想跨过千山万水的Debug&#xff0c;最后与变量未初始…

P8715 [蓝桥杯 2020 省 AB2] 子串分值

一、题目描述 P8715 [蓝桥杯 2020 省 AB2] 子串分值 二、问题简析 记录字符串 s s s 的 第 i i i 个字符 s i s_i si​&#xff08; 0 ≤ i < s . s i z e 0\leq i<s.size 0≤i<s.size&#xff09;上一次出现的位置 p r e i pre_i prei​、下一次出现的位置 n…

模型部署实战:从训练到上线

目录 1.前言 2.RESTful API设计 3.使用Flask/Django开发后端服务 4.使用TensorFlow Serving部署模型 5.性能监控与服务维护要点 6.总结 1.前言 在机器学习的全周期中&#xff0c;模型部署是至关重要的一环。经过长时间的训练、验证和优化&#xff0c;当模型准备就绪时&am…

【Leetcode】top 100 栈

基础知识补充 1.栈是一种运算受限的线性表&#xff0c;仅允许在一端进行插入和删除操作&#xff1b; 2.可用列表实现&#xff0c;list.append(val) // list.pop() 题目 20 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的…

Linux:详解TCP报头类型

文章目录 温习序号的意义序号和确认序号报文的类型 TCP报头类型详解ACK: 确认号是否有效SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段FIN: 通知对方, 本端要关闭了PSH: 提示接收端应用程序立刻从TCP缓冲区把数据读走RST: 对方要求重新建立连接; 我们把携带RST标识的称…

如何在ArcGIS中查看栅格数据的值类型(整数或浮点数)

在 ArcGIS 中查看栅格数据的值类型&#xff08;整数或浮点数&#xff09;&#xff0c;您可以按照以下步骤操作&#xff1a; 1. **点击栅格单元格**&#xff1a; - 使用“信息”工具&#xff08;Identify Tool&#xff0c;通常是一个带放大镜和一个字母 i 的图标&#xff09…

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

JAVA面试大全之数据库篇

目录 1、原理和SQL 1.1、什么是事务?事务基本特性ACID? 1.2、数据库中并发一致性问题? 1.3、事务的隔离等级? 1.4、ACID靠什么保证的呢?