Java 编程实现常见的排序算法

在Java编程中,实现常见的排序算法是一项基础而重要的任务。排序算法是计算机科学中的经典问题之一,涉及将一组元素按照某个顺序进行排列。Java提供了一种非常灵活的编程环境,可以用来实现各种排序算法。

冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,它重复地遍历待排序数组,比较相邻的两个元素,如果它们的顺序不对,则交换它们。这个过程持续进行,直到整个数组都是有序的。

public class BubbleSort {public static void bubbleSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (array[j] > array[j + 1]) {// 交换array[j]和array[j+1]int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;}}}}public static void main(String[] args) {int[] array = {64, 34, 25, 12, 22, 11, 90};bubbleSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}
}

选择排序(Selection Sort)

选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找最小(或最大)元素,依次类推。

public class SelectionSort {public static void selectionSort(int[] array) {int n = array.length;for (int i = 0; i < n - 1; i++) {int minIndex = i;for (int j = i + 1; j < n; j++) {if (array[j] < array[minIndex]) {minIndex = j;}}// 交换array[i]和array[minIndex]int temp = array[i];array[i] = array[minIndex];array[minIndex] = temp;}}public static void main(String[] args) {int[] array = {64, 25, 12, 22, 11};selectionSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}
}

插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法,它的工作原理是将一个元素插入到已排序好的数组中。插入排序从第一个元素开始,认为第一个元素是已排序的,然后将下一个元素插入到已排序的数组中,直到所有元素都被插入到合适的位置。

public class InsertionSort {public static void insertionSort(int[] array) {int n = array.length;for (int i = 1; i < n; i++) {int key = array[i];int j = i - 1;// 将array[0..i-1]中大于key的元素往后移动while (j >= 0 && array[j] > key) {array[j + 1] = array[j];j = j - 1;}// 将key插入到正确的位置array[j + 1] = key;}}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6};insertionSort(array);System.out.println("Sorted array: " + Arrays.toString(array));}
}

归并排序(Merge Sort)

归并排序是一种分治算法,它将一个数组分成两个子数组,分别对子数组进行排序,然后合并这两个子数组以得到最终的有序数组。

import java.util.Arrays;public class MergeSort {public static void merge(int[] array, int left, int middle, int right) {int n1 = middle - left + 1;int n2 = right - middle;// 创建临时数组int[] leftArray = new int[n1];int[] rightArray = new int[n2];// 将数据复制到临时数组 leftArray[] 和 rightArray[]for (int i = 0; i < n1; ++i)leftArray[i] = array[left + i];for (int j = 0; j < n2; ++j)rightArray[j] = array[middle + 1 + j];// 归并临时数组到 array[left..right]int i = 0, j = 0;int k = left;while (i < n1 && j < n2) {if (leftArray[i] <= rightArray[j]) {array[k] = leftArray[i];i++;} else {array[k] = rightArray[j];j++;}k++;}// 复制剩余的元素while (i < n1) {array[k] = leftArray[i];i++;k++;}while (j < n2) {array[k] = rightArray[j];j++;k++;}}public static void mergeSort(int[] array, int left, int right) {if (left < right) {// 找出中间点int middle = left + (right - left) / 2;// 对左侧和右侧进行递归排序mergeSort(array, left, middle);mergeSort(array, middle + 1, right);// 合并已排序的子数组merge(array, left, middle, right);}}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6, 7};int n = array.length;System.out.println("Original array: " + Arrays.toString(array));mergeSort(array, 0, n - 1);System.out.println("Sorted array: " + Arrays.toString(array));}
}

快速排序(Quick Sort)

快速排序是一种分治算法,它选择一个元素作为基准,将数组分成两个子数组,小于基准的放在左边,大于基准的放在右边,然后递归地对子数组进行排序。

import java.util.Arrays;public class QuickSort {public static int partition(int[] array, int low, int high) {int pivot = array[high];int i = low - 1;for (int j = low; j < high; j++) {if (array[j] <= pivot) {i++;// 交换 array[i] 和 array[j]int temp = array[i];array[i] = array[j];array[j] = temp;}}// 交换 array[i+1] 和 array[high]int temp = array[i + 1];array[i + 1] = array[high];array[high] = temp;return i + 1;}public static void quickSort(int[] array, int low, int high) {if (low < high) {// 获取分区点int partitionIndex = partition(array, low, high);// 对左右子数组进行递归排序quickSort(array, low, partitionIndex - 1);quickSort(array, partitionIndex + 1, high);}}public static void main(String[] args) {int[] array = {12, 11, 13, 5, 6, 7};int n = array.length;System.out.println("Original array: " + Arrays.toString(array));quickSort(array, 0, n - 1);System.out.println("Sorted array: " + Arrays.toString(array));}
}

以上是几种常见的排序算法的Java实现。每种排序算法都有其特定的应用场景和性能特点。在实际应用中,根据数据规模和特点选择合适的排序算法是很重要的。这些排序算法的实现可以作为学习算法和数据结构的起点,理解它们的原理有助于提高编程技能和解决实际问题。

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

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

相关文章

【Maven】<scope>provided</scope>

在Maven中&#xff0c;“provided”是一个常用的依赖范围&#xff0c;它表示某个依赖项在编译和测试阶段是必需的&#xff0c;但在运行时则由外部环境提供&#xff0c;不需要包含在最终的项目包中。下面是对Maven scope “provided”的详细解释&#xff1a; 编译和测试阶段可用…

帆软FineBi V6版本经验总结

帆软FineBi V6版本经验总结 BI分析出现背景 ​ 现在是一个大数据的时代&#xff0c;每时每刻都有海量的明细数据出现。这时大数据时代用户思维是&#xff1a;1、数据的爆炸式增长&#xff0c;人们比起明细数据&#xff0c;更在意样本的整体特征、相互关系。2、基于明细的“小…

PyTorch中的 Dataset、DataLoader 和 enumerate()

PyTorch&#xff1a;关于Dataset&#xff0c;DataLoader 和 enumerate() 本博文主要参考了 Pytorch中DataLoader的使用方法详解 和 pytorch&#xff1a;关于enumerate&#xff0c;Dataset和Dataloader 两篇文章进行总结和归纳。 DataLoader 隶属 PyTorch 中 torch.utils.data…

数据结构之树 --- 二叉树

目录 定义二叉树的结构体 二叉树的遍历 递归遍历 非递归遍历 链式二叉树的实现 二叉树的功能接口 先序遍历创建二叉树 后序遍历销毁二叉树 先序遍历查找树中值为x的节点 层序遍历 上篇我们对二叉树的顺序存储堆进行了讲述&#xff0c;本文我们来看链式二叉树。 定…

SpringCloud(H版alibaba)框架开发教程之nacos做配置中心——附源码(2)

上篇主要讲了使用eureka&#xff0c;zk&#xff0c;nacos当注册中心 这篇内容是nacos配置中心 代码改动部分mysql驱动更新到8.0&#xff0c;数据库版本升级到了8.0&#xff0c;nacos版本更新到了2.x nacos2.x链接 链接&#xff1a;https://pan.baidu.com/s/11nObzgTjWisAfOp…

探秘交互设计:深入了解五大核心维度!

交互式设计是用户体验&#xff08;UX&#xff09;设计的重要组成部分。本文将解释什么是交互设计&#xff0c;并分享一些有用的交互设计模型&#xff0c;并简要描述交互设计师通常做什么。 如何解释交互设计 交互式设计可以用一个简单的术语来理解&#xff1a;它是用户和产品…

探索深度学习在自然语言处理中的应用

摘要&#xff1a; 随着人工智能技术的不断发展&#xff0c;深度学习在自然语言处理领域的应用越来越广泛。本文将探讨深度学习在自然语言处理中的各种应用&#xff0c;包括文本分类、情感分析、机器翻译等&#xff0c;并分析其优缺点。 一、引言 自然语言处理&#xff08;NLP…

借贷协议 Tonka Finance:铭文资产流动性的新破局者

“Tonka Finance 是铭文赛道中首个借贷协议&#xff0c;它正在为铭文资产赋予捕获流动性的能力&#xff0c;并为其构建全新的金融场景。” 在 2023 年的 1 月&#xff0c;比特币 Ordinals 协议被推出后&#xff0c;包括 BRC20&#xff0c;Ordinals 等在内的系列铭文资产在包括比…

nginx源码分析-3

这一章内容讲述nginx中的事件是如何一步步添加到epoll实例中的。 在初始化http连接的函数ngx_http_init_connection中&#xff0c;nginx为http连接初始化了处理请求的回调函数&#xff0c;之后调用ngx_handle_read_event函数对可读数据进行处理。这里只为连接设置read而没有设…

Ubuntu22.04 安装教程

系统下载 Ubuntu官网下载 清华源镜像 安装流程 1. 选择安装语言 2. 选择是否在安装时更新 为了系统安装速度一般选择安装时不更新&#xff0c;安装后自行更新 3. 选择系统语言和键盘布局 4. 选择安装模式 5. 配置网络信息 6. 设置静态IP 7. 配置代理信息 8. 配置Ubuntu镜像…

非常好用的ocr图片文字识别技术,识别图片中的文字

目录 一.配置环境 二.应用 2.1常见图片识别 2.2排版简单的印刷体截图图片识别 2.3竖排文字识别 2.4英文识别 2.5繁体中文识别 2.6单行文字的图片识别 三.参考 一.配置环境 pip3 install cnocr -i https://pypi.tuna.tsinghua.edu.cn/simple pip3 install onnxruntime…

在电脑上免费分区的 5 个有效磁盘分区软件工具

磁盘分区可能是一个脆弱而复杂的过程&#xff0c;磁盘崩溃或用户设备受到病毒攻击的风险很高。因此&#xff0c;它们很难由用户单独或手动管理。本文详细介绍了可以帮助简化磁盘分区过程的不同软件工具、它们的功能和优点。那么让我们开始吧。 什么是磁盘分区工具&#xff1f; …

在STM32中集成TSL2561光强传感器的开发和调试

在STM32中集成TSL2561光强传感器的开发和调试是一个常见的应用场景。TSL2561是一款数字光传感器&#xff0c;能够测量可见光和红外光的光强&#xff0c;并通过I2C接口将数据传输给微控制器。下面将为您介绍在STM32中集成TSL2561传感器的开发步骤&#xff0c;并附上相应的代码示…

Web常用的编码和解码技术

文章目录 一、URI的编码与解码1.1 URI介绍1.2 什么是encodeURI1.3 什么是encodeURIComponent1.4 应用场景1.5 URI解码1.6 扩展&#xff1a;内置对象URL 二、字符串的Base64编码与解码2.1 ASCII字符编解码2.2 非ASCII字符编解码 一、URI的编码与解码 1.1 URI介绍 URI指的是统一…

【音视频 ffmpeg 学习】 RTMP推流 mp4文件

1.RTMP(实时消息传输协议)是Adobe 公司开发的一个基于TCP的应用层协议。 2.RTMP协议中基本的数据单元称为消息&#xff08;Message&#xff09;。 3.当RTMP协议在互联网中传输数据的时候&#xff0c;消息会被拆分成更小的单元&#xff0c;称为消息块&#xff08;Chunk&#xff…

Linux系统下隧道代理HTTP

在Linux系统下配置隧道代理HTTP是一个涉及网络技术的话题&#xff0c;主要目的是在客户端和服务器之间建立一个安全的通信通道。下面将详细解释如何进行配置。 一、了解基本概念 在开始之前&#xff0c;需要了解几个关键概念&#xff1a;代理服务器、隧道代理和HTTP协议。代理…

VsCode的介绍和入门详细讲解

VS Code&#xff08;Visual Studio Code&#xff09;是由 Microsoft 开发的一款轻量级开源编辑器&#xff0c;支持多种语言和框架的编写、调试和测试。它拥有丰富的扩展生态系统&#xff0c;可以满足不同开发者的需求。 下面是 VS Code 的入门详细讲解&#xff1a; 下载和安装…

使用Python绘制各种图表

1、折线图&#xff08;Line Chart&#xff09; import matplotlib.pyplot as plt # 数据 x [1, 2, 3, 4, 5] y [2, 4, 1, 3, 7] # 绘制折线图 plt.plot(x, y) plt.title(折线图示例) plt.xlabel(X轴) plt.ylabel(Y轴) plt.show() 2、柱状图&#xff08;Bar…

算法专题四:前缀和

前缀和 一.一维前缀和(模板)&#xff1a;1.思路一&#xff1a;暴力解法2.思路二&#xff1a;前缀和思路 二. 二维前缀和(模板)&#xff1a;1.思路一&#xff1a;构造前缀和数组 三.寻找数组的中心下标&#xff1a;1.思路一&#xff1a;前缀和 四.除自身以外数组的乘积&#xff…

3、Git分支操作与团队协作

Git分支操作 1.什么是分支2. 分支的好处3. 分支的操作3.1 查看分支3.2 创建分支3.3 切换分支3.4 修改分支3.5 合并分支3.6 产生和解决冲突 4. 创建分支和切换分支图解5. Git团队协作机制团队内协作跨团队协作 均在git bash中进行操作。事先建好本地工作库 1.什么是分支 在版本…