冒泡排序、选择排序、计数排序、插入排序、快速排序、堆排序、归并排序JAVA实现

常见排序算法实现

冒泡排序、选择排序、计数排序、插入排序、快速排序、堆排序、归并排序JAVA实现

文章目录

  • 常见排序算法实现
    • 冒泡排序
    • 选择排序
    • 计数排序
    • 插入排序
    • 快速排序
    • 堆排序
    • 归并排序

冒泡排序

冒泡排序算法,对给定的整数数组进行升序排序。冒泡排序是一种简单的排序算法,通过多次遍历数组并相邻元素比较与交换来排列数组。代码最后将排序后的数组打印到控制台上,输出结果为:1 2 3 5 8 9。

public class BubbleSort {public static void main(String[] args) {int[] arr = {5, 2, 8, 3, 9, 1};bubbleSort(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void bubbleSort(int[] arr) {int n = arr.length;for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// swap arr[j] and arr[j+1]int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}
}

选择排序

选择排序算法,其主要功能是对一个整数数组进行升序排序。选择排序的基本思想是每次从未排序部分中选择最小元素,将其放在已排好序的部分的末尾。该算法的时间复杂度为 O(n²),在数据量较小的情况下性能较为优秀。最终,排序后的数组会被打印输出。

public class SelectionSort {public static void main(String[] args) {int[] arr = {5, 2, 8, 3, 9, 1};selectionSort(arr); // sorting the array in ascending orderfor (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void selectionSort(int[] arr) {for (int i = 0; i < arr.length - 1; i++) {int minIndex = i;for (int j = i + 1; j < arr.length; j++) {if (arr[j] < arr[minIndex]) {minIndex = j;}}if (minIndex!= i) {int temp = arr[i];   // swapping the elementsarr[i] = arr[minIndex];arr[minIndex] = temp;}}}
}

计数排序

计数排序是一种非比较排序算法,主要用于对范围较小的整数集合进行排序。其主要功能是对给定的整数数组 arr 进行从小到大的排序。该算法的时间复杂度为 O(n + k),其中 n 是数组元素的个数,k 是最大元素的值,适合用于处理大量重复值的数据集。

public class CountingSort {public static void main(String[] args) {int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};int max = 9;int[] count = new int[max + 1];int[] output = new int[arr.length];// Step 1: Count the frequency of each elementfor (int i = 0; i < arr.length; i++) {count[arr[i]]++;}// Step 2: Calculate the cumulative sum of the frequencyfor (int i = 1; i <= max; i++) {count[i] += count[i - 1];}// Step 3: Place each element in its correct position in the output arrayfor (int i = arr.length - 1; i >= 0; i--) {output[count[arr[i]] - 1] = arr[i];count[arr[i]]--;}// Step 4: Copy the output array to the original arrayfor (int i = 0; i < arr.length; i++) {arr[i] = output[i];}// Print the sorted arrayfor (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}
}

插入排序

插入排序算法,其主要功能是对一个随机生成的整数数组进行排序。插入排序是一种简单直观的排序算法,适合于小规模的数组,时间复杂度为 O(n^2)。通过不断将未排序的元素插入到已排序部分的合适位置,最终得到一个升序排列的数组。代码中的 main 方法演示了如何使用这个方法并输出排序结果。

public class InsertionSort {public static void main(String[] args) {int[] arr = {5, 2, 4, 6, 1, 3};insertionSort(arr);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}}
}

快速排序

快速排序算法,其主要功能是对一个整数数组进行排序。快速排序是一种高效的排序算法,其平均时间复杂度为 O(n log n)。该代码通过选择支点(通常是数组的最后一个元素),然后将数组分为两个子数组,递归地对这两个子数组进行排序,最终得到一个有序的数组。打印输出展示了排序结果。

public class QuickSort {public static void main(String[] args) {int[] arr = {5, 2, 8, 3, 9, 1, 7, 4, 6};quickSort(arr, 0, arr.length - 1);for (int i : arr) { System.out.print(i + " "); }}public static void quickSort(int[] arr, int left, int right) {if (left < right) {int pivotIndex = partition(arr, left, right);quickSort(arr, left, pivotIndex - 1);quickSort(arr, pivotIndex + 1, right);}}public static int partition(int[] arr, int left, int right) {int pivot = arr[right];int i = left - 1;for (int j = left; j < right; j++) {if (arr[j] < pivot) {i++;int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}int temp = arr[i + 1];arr[i + 1] = arr[right];arr[right] = temp;return i + 1;}
}

堆排序

堆排序的主要功能:将一个整数数组排序。堆排序的过程包括建立最大堆并逐步将最大元素移动到数组的末尾,最终得到升序排列的数组。整个算法的时间复杂度为 O(n log n),空间复杂度为 O(1)。堆排序是一种不稳定的排序算法。

public class HeapSort {public static void sort(int[] arr) {int n = arr.length;for (int i = n / 2 - 1; i >= 0; i--)heapify(arr, n, i);for (int i = n - 1; i >= 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;heapify(arr, i, 0);}}private static void heapify(int[] arr, int n, int i) {int largest = i;int l = 2 * i + 1;int r = 2 * i + 2;if (l < n && arr[l] > arr[largest])largest = l;if (r < n && arr[r] > arr[largest])largest = r;if (largest!= i) {int swap = arr[i];arr[i] = arr[largest];arr[largest] = swap;heapify(arr, n, largest);}}
}

归并排序

归并排序是一种有效的排序算法,采用分治法的思想,将待排序的数组递归地分成两半,直至每个子数组只有一个元素,然后再将这些子数组合并为一个有序的整体。最终该程序能够将输入的数组 {5, 2, 8, 3, 9, 1, 7, 4, 6} 排序并打印输出。归并排序的时间复杂度为O(nlogn) 使其在处理大型数据集时十分高效。

public class MergeSort {public static void main(String[] args) {int[] arr = {5, 2, 8, 3, 9, 1, 7, 4, 6};mergeSort(arr, 0, arr.length - 1);for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}}public static void mergeSort(int[] arr, int left, int right) {if (left < right) {int mid = (left + right) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}}public static void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];int i = left;int j = mid + 1;int k = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}for (i = left; i <= right; i++) {arr[i] = temp[i - left];}}
}

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

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

相关文章

Linux系统的入门使用

前言一、常用操作以及概念 快捷键求助关机PATHsudo包管理工具发行版VIM 三个模式GNU开源协议 二、磁盘 磁盘接口磁盘的文件名 三、分区 分区表开机检测程序 四、文件系统 分区与文件系统组成文件读取磁盘碎片blockinode目录日志挂载目录配置 五、文件 文件属性文件与目录的基本…

软考系统分析师知识点三二:案例知识点三

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 倒计时&#xff1a;5天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第三阶段&#xff1a;总结案例知识点&#xff0c;并作为论文的框架知识…

无人机维护保养、部件修理更换技术详解

无人机作为一种精密的航空设备&#xff0c;其维护保养和部件修理更换是确保飞行安全、延长使用寿命的重要环节。以下是对无人机维护保养、部件修理更换技术的详细解析&#xff1a; 一、无人机维护保养技术 1. 基础构造理解&#xff1a; 熟悉无人机的基本构造&#xff0c;包括…

高校大数据实训平台介绍

高校大数据实验室架构 具体实训平台介绍 编程实训平台 1、大数据开发实训平台 大数据开发实训平台是面向实训课和课后训练的编程实训平台&#xff0c;平台底层基于Docker技术&#xff0c;采用容器云部署方案&#xff0c;预装大数据相关课程教学所需的实训环境…

SQL基础—2

1.左外连接查询&#xff08;left join on&#xff09; A - A∩B 左外连接查询两张表条件都满足的数据&#xff0c;以及左边表(A表)存在的数据(以左边表为主查询表)。 A - A∩B (A和A交B)。 示例&#xff1a;使用左外连接将dept表作为主查询表&#xff0c;查询员工编号、员工姓…

R语言贝叶斯:INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析

原文链接&#xff1a;R语言贝叶斯&#xff1a;INLA下的贝叶斯回归、生存分析、随机游走、广义可加模型、极端数据的贝叶斯分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247625527&idx8&snba4e50376befd94022519152609ee8d0&chksmfa8daad0cdfa23c6…

如何自学机器学习?

自学机器学习可以按照以下步骤进行&#xff1a; 一、基础知识准备 数学基础&#xff1a; 高等数学&#xff1a;学习微积分&#xff08;包括导数、微分、积分等&#xff09;、极限、级数等基本概念。这些知识是后续学习算法和优化方法的基础。 线性代数&#xff1a;掌握矩阵…

wpf 制作丝滑Flyout浮出侧边栏Demo (Mahapps UI框架)

Flyout 属性 CloseButtonVisibility: 设置为 Collapsed&#xff0c;意味着关闭按钮不可见。TitleVisibility: 设置为 Collapsed&#xff0c;意味着标题不可见。IsPinned: 设置为 True&#xff0c;意味着这个 Flyout 会固定住&#xff0c;不会自动关闭。Opacity: 设置为 1&…

6个步骤,轻松搞定Linux上web UI自动化测试!

对于web端的UI自动化&#xff0c;相信大家都不会陌生&#xff0c;因为很多小伙伴都做过&#xff0c;或者了解到过&#xff0c;但是小编相信&#xff0c;大多数了解到的都是通过windows系统上进行运行web端的UI自动化&#xff0c;在linux上面很少运行UI自动化或者如何执行自动化…

[论文阅读]Label-Only Membership Inference Attacks

Label-Only Membership Inference Attacks Proceedings of the 38th International Conference on Machine Learning Label-Only Membership Inference Attacks 只使用硬标签就可以判断是否是成员的方法&#xff0c;但是是在机器学习模型上。 通过分析模型在扰动下的预测标…

万宇科技闪耀创新舞台 荣膺潜在独角兽企业殊荣

2024年10月24日&#xff0c;在“2024东北亚(沈阳)人才交流大会暨中国潜在独角兽企业发展大会”上&#xff0c;长城战略咨询重磅发布《GEI中国潜在独角兽企业研究报告2024》&#xff0c;揭示了中国潜在独角兽企业群体的最新发展态势。其中&#xff0c;安徽万宇机械设备科技有限公…

Java Iterator 实现杨辉三角

一、问题描述 杨辉三角定义如下&#xff1a; 1/ \1 1/ \ / \1 2 1/ \ / \ / \1 3 3 1/ \ / \ / \ / \1 4 6 4 1/ \ / \ / \ / \ / \ 1 5 10 10 5 1 把每一行看做一个list&#xff0c;试写一个 Iterator&#xff0c;不断输出下一行的 list&#xf…

解决注册Kaggle出现的“Captcha must be filled out”问题

首先&#xff0c;出现这个问题后&#xff0c;就搜索了一下别的博主的方法。 使用header editor 插件 首先&#xff0c;下载扩建&#xff1a; 然后进行重定向&#xff1a; 管理之后&#xff0c;输入下面的地址&#xff0c;然后下载-保存&#xff1a; 但是&#xff0c;这条显然…

【Python】 select模块详解 所有程序猿必看!!!

要理解select.select模块其实主要就是要理解它的参数, 以及其三个返回值。 select()方法接收并监控3个通信列表&#xff0c; 第一个是所有的输入的data,就是指外部发过来的数据&#xff0c;第2个是监控和接收所有要发出去的data(outgoing data),第3个监控错误信息 在网上一直在…

JavaIO流操作

目录 简介 字节输入流 获取字节输入流 读 关闭输入流 字节输出流 获取字节输出流 写 换行符 刷新 关闭输出流 字符流输入流 获取字符输入流 读 关闭输入流 字符输出流 获取字符输出流 写 换行符 刷新 关闭输出流 简介 IO流分为两大派系&#xff1a; …

大数据之Hadoop集群

Hadoop集群介绍&#xff1f;Hadoop集群的优缺点及应用场景&#xff1f;Hadoop集群搭建&#xff1f;Hadoop架构&#xff1f; Hadoop集群介绍 Hadoop集群是由多台计算机&#xff08;节点&#xff09;组成的一个分布式计算系统&#xff0c;主要用于处理大规模的数据集。以下是对Ha…

项目推荐:指针切换器

小编的inscode部署项目&#xff1a;割绳子游戏。 更多精彩内容见InsCode - 让你的灵感立刻落地~ 介绍一下项目。 引言 在现代用户界面设计中&#xff0c;鼠标指针的样式和行为对用户体验有着重要的影响。传统的鼠标指针样式&#xff08;如箭头、手形、等待图标等&#xff09…

D-ID 推出能模仿用户的头部动作以及实时互动的 AI 头像

D-ID 宣布推出两种新型 AI 头像 — — Express 和 Premium&#xff0c;旨在提升内容创作的灵活性和人性化。这些头像将为企业在营销、销售和客户支持等领域的视频制作提供便利。用户只需少量文本输入和视觉数据&#xff0c;即可生成更自然的商业视频。 Express 头像可以通过约一…

【C++系列】-----------内存管理

c内存管理&#xff08;涉及&#xff1a;数据在内存中的分布、new和delete使用、动态内存管理等&#xff09; 文章目录 c内存管理&#xff08;涉及&#xff1a;数据在内存中的分布、new和delete使用、动态内存管理等&#xff09;前言一、C/C内存分布二、C中动态内存管理2.1、 ne…

SpringBoot框架:作业管理系统构建之道

摘 要 使用旧方法对作业管理信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在作业管理信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的作业管理系统有管…