Java----冒泡排序、选择排序、插入排序、快速排序、堆排序

int[] arr = {4, 2, 7, 1, 5, 9, 3, 6, 8};
冒泡排序

for(int i = 0; i < arr.length-1; i++) //外循环是控制排序的次数n-1, 每次循环结束确定一个最大值{for(int j = 0; j < arr.length - 1 - i; j++) // 内循环是第i次循环中比较的次数n-i{if(arr[j] > arr[j+1]){//前面一个和后面一个相互比较,较大的和较小的交换位置,较小的排前面,本次循环完成之后最大的放最后int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}

插入排序

for(int i = 1; i < arr.length; i++) //外循环是1到n-1,左边取出数组第0个元素作为已经排序数组,接着i从数组中第1元素个开始循环{int k=arr[i];//取出arr[i]保存到kint j=i-1;//arr[i]前面的那个元素while(j>=0 && arr[j]>k) {arr[j+1]=arr[j];//左边的元素向右覆盖后面的元素j--;//一直向左比较}arr[j+1]=k;//找到位置插入}

选择排序

for(int i = 0; i < arr.length; i++) //外循环是0到n-1,每次挑选出最小的元素,一共需要挑选n-1次{int index=i;//保存待排序元素中最小的下标for(int j=i+1;j<arr.length;j++) {if(arr[j]<=arr[index]) {//找到待排序中最小的index=j;}}//arr[index]和待排序中的第一个arr[i]交换int temp=arr[i];arr[i]=arr[index];arr[index]=temp;}

计数排序
int[] arr = {0,2,5,3,7,9,3,3,3,7}

 		// 找到待排序数组中的最大值int max = Arrays.stream(arr).max().getAsInt();// 创建计数数组,并初始化为 0int[] countArray = new int[max + 1];for (int i = 0; i < countArray.length; i++) {countArray[i] = 0;}// 统计数组中每个元素的出现次数for (int i = 0; i < arr.length; i++) {countArray[array[i]]++;}// 计算每个元素在排序后的序列中的位置for (int i = 1; i < countArray.length; i++) {countArray[i] += countArray[i - 1];}// 创建一个临时数组存储排序结果int[] tempArray = new int[arr.length];for (int i = array.length - 1; i >= 0; i--) {tempArray[countArray[arr[i]] - 1] = arr[i];countArray[arr[i]]--;}// 将临时数组的内容复制回原始数组for (int i = 0; i < arr.length; i++) {arr[i] = tempArray[i];}

归并排序
使用递归方式,将数组对半分,再对半分(如:8—4—2—1),直到为一个不能再分,再排序合并(如:1–2–4–8)

package gg;public class Solution {public static void main(String args[]) {int[] arr = {1,5,3,4,7,8,9,6,2,0};System.out.print("排序前的数组为:");for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}merge_sort(arr);System.out.println();System.out.print("排序后的数组为:");for(int i = 0; i < arr.length; i++){System.out.print(arr[i] + " ");}}static void merge_sort_recursive(int[] arr, int[] result, int start, int end) {// 1、分解到最小需要解决的地步,无法再分解了if (start >= end){// 需要开始解决问题return;}// 2、解决// 计算数组 arr 的中间位置    int mid = (start + end ) / 2;// start1 为左区间的开始位置int start1 = start;// end1 为左区间的结束位置int end1 = mid;// start2 为右区间的开始位置int start2 = mid + 1;// end2 为右区间的结束位置int end2 = end;// 调用 merge_sort_recursive 函数,将 arr 数组中的 start1 到 end1 这一区间的数字排序后,并存放到 result 中merge_sort_recursive(arr, result, start1, end1);// 调用 merge_sort_recursive 函数,将 arr 数组中的 start2 到 end2 这一区间的数字排序后,并存放到 result 中merge_sort_recursive(arr, result, start2, end2);// 3、合并// 将左右区间中较小的数字存放到 result 中,从 k 开始int k = start;while (start1 <= end1 && start2 <= end2){// 如果 arr[start1] < arr[start2])if(arr[start1] < arr[start2]){// result[k] 存放的是 arr[start1]result[k] = arr[start1] ;start1++;k++;}else{// 否则,result[k] 存放的是 arr[start2]result[k] = arr[start2] ;start2++;k++;}}// 如果左区间中还有元素,那么把它都添加到 result 中while (start1 <= end1){result[k] = arr[start1];k++;start1++;}// 如果右区间中还有元素,那么把它都添加到 result 中while (start2 <= end2){result[k] = arr[start2];k++;start2++;}// 最后,把结果赋值到 arr 中for (k = start; k <= end; k++)arr[k] = result[k];}public static void merge_sort(int[] arr) {int len = arr.length;int[] result = new int[len];merge_sort_recursive(arr, result, 0, len - 1);}
}

快速排序

package gg;import java.util.Arrays;public class Solution {public static void main(String args[]) {int[] nums = {1,5,1,8,2,2,4,2,2,3};// 打印排序前的数组System.out.println(Arrays.toString(nums));// 执行快速排序操作quickSort(nums,0,nums.length - 1);// 打印排序后的数组System.out.println(Arrays.toString(nums));}// 函数传入待排序数组 nums// 排序区间的左端点 left// 排序区间的右端点 rightprivate static void quickSort(int[] nums,int left, int right){// 如果 left 大于等于 right,说明该区间只有 1 个或者没有元素if( left >=right ){// 无需再递归划分后再排序,直接返回return;}// 调用函数 partition,将 left 和 right 之间的元素划分为左右两部分int mid = partition(nums,left,right);// 划分之后,再对 mid 左侧的元素进行快速排序quickSort(nums,left,mid - 1);// 划分之后,再对 mid 右侧的元素进行快速排序quickSort(nums,mid + 1,right);}private static int partition(int[] nums, int left ,int right){// 经典快速排序的写法// 设置当前区间的第一个元素为基准元素int pivot = nums[left];// left 向右移动,right 向左移动,直到 left 和 right 指向同一元素为止while( left < right ){// 只有当遇到小于 pivot 的元素时,right 才停止移动// 此时,right 指向了一个小于 pivot 的元素,这个元素不在它该在的位置上while( left < right && nums[right] >= pivot ){// 如果 right 指向的元素是大于 pivot 的,那么// right 不断的向左移动right--;}// 将此时的 nums[left] 赋值为 nums[right]// 执行完这个操作,比 pivot 小的这个元素被移动到了左侧nums[left] = nums[right];// 只有当遇到大于 pivot left 才停止移动// 此时,left 指向了一个大于 pivot 的元素,这个元素不在它该在的位置上while( left < right && nums[left] <= pivot){// 如果 left 指向的元素是小于 pivot 的,那么// left 不断的向右移动left++;}// 将此时的 nums[right] 赋值为 nums[left]// 执行完这个操作,比 pivot 大的这个元素被移动到了右侧nums[right] = nums[left];}// 此时,left 和 right 相遇,那么需要将此时的元素设置为 pivot// 这个时候,pivot 的左侧元素都小于它,右侧元素都大于它nums[left] = pivot;// 返回 leftreturn left;}
}

堆排序

package gg;import java.util.Arrays;public class Solution {public static void main(String args[]) {int[] arr = {1,5,1,8,7,6,4,2,2,3};// 打印排序前的数组System.out.println(Arrays.toString(arr));// 执行堆排序操作heapSort(arr);		// 打印排序后的数组System.out.println(Arrays.toString(arr));}public static void heapSort(int[] arr){// 1、将无序序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆for(int i = arr.length / 2 - 1 ; i >= 0 ; i-- ){//从第一个非叶子节点从下至上,从后向前调整结构adjustHeap( arr , i , arr.length );}// 2、将堆顶元素与末尾元素交换,将最大元素”沉”到数组末端,此时数组末端存储了当前区间最大的元素for(int j = arr.length - 1 ; j > 0 ; j-- ){// 3、每次将堆顶元素与末尾元素进行交换,使末尾元素最大swap(arr,0,j);// 4、重新对堆进行调整adjustHeap(arr,0,j);// 执行完 4 之后,剩下未排序的那些元素依旧维护着一个最大堆,继续下一轮循环}}// 调整大顶堆public static void adjustHeap(int []arr,int parent,int length){// 1、取出当前元素,需要把它挪到正确的位置上,比如此时是 A 元素//       A//     /   \//    B     Cint temp = arr[parent]; // 2、从 parent 节点的左子节点开始// 也就是 2 * parent + 1 处开始int child = 2 * parent + 1 ;while(child < length){//       A//     /   \//    B     C// 获取 A 、B 、C 三者的最大值,把它放到 A 位置// 于是,第一步先去对比 B 和 C,查看它们的较大值是哪一个// 3、如果左子节点小于右子节点,child 指向右子节点if( child + 1 < length && arr[child] < arr[ child + 1 ] ){child++;}// 如果父节点的值已经大于孩子节点的值,说明在正确位置上// 直接结束if (temp >= arr[child]){break;}// B 、 C 都是 A 的子节点,如果 B 、 C 的较大值大于 A// 将最大值赋值给 Aarr[parent] = arr[child];// 此时,parent 这个节点已经存放了正确的元素//       B//     /   \//    B     C// 接下来,需要观察一下,parent 原先的节点值 A 应该放到哪个位置// 所以,顺着 parent 这个节点来到它的子节点,就是 B 这个节点的位置,也是 child 这个节点的位置parent = child;// 那么,子节点也发生了变化,从它的左子节点开始child = 2 * parent + 1;}// 将 temp 值放到最终的位置arr[parent] = temp;}// 交换元素public static void swap(int []arr,int a ,int b){int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}
}

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

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

相关文章

LeetCode-23. 合并 K 个升序链表

问题分析 先建立一个小顶堆将每一路的最小元素都加入小顶堆&#xff0c;此时堆顶元素就是全局的最小值将堆顶元素弹出。若堆顶元素所在的数组不为空&#xff0c;则将下一元素加入堆中重复2、3操作&#xff0c;直到所有数据都读取完毕将堆内元素按顺序读出&#xff0c;并清空堆…

双系统安装显卡驱动

安装步骤 更新系统: 在安装任何新软件之前&#xff0c;最好先更新系统&#xff0c;以确保所有依赖都是最新的。打开终端&#xff08;Terminal&#xff09;并运行以下命令&#xff1a; sudo apt update sudo apt upgrade关闭Nouveau驱动: Nouveau是Nvidia显卡的开源驱动&#xf…

Linux系统使用ESP8266开发板(CP2102)

连接ESP8266开发板到电脑 虚拟机选择开发板硬件连接 查看USB连接情况: lsusb 授权USB接口访问 成功连接 编译项目 上传到开发板 成功提供WIFI热点服务

跳跃游戏 + 45. 跳跃游戏 II

给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

动态SQL学习及使用场景(简略)

假设我们有一个商品表&#xff0c;包含id、name、price和category四个字段。现在需要实现修改商品价格的功能&#xff0c;我们可以使用动态SQL实现。 首先&#xff0c;我们需要构造一个SQL语句&#xff0c;根据用户提供的参数来动态生成&#xff0c;具体实现如下&#xff1a; …

三、Shell 环境

一、Linux 系统分类 在 Linux 中&#xff0c;常见的 Shell 有以下几种&#xff1a; Bourne Shell&#xff08;sh&#xff09;&#xff1a;最早的 Shell&#xff0c;由 Stephen Bourne 开发。它是大多数其他 Shell 的基础。Bourne Again Shell&#xff08;bash&#xff09;&am…

Tomcat指定jdk启动

要在Tomcat中指定使用特定的JDK启动&#xff0c;可以按照以下步骤进行操作&#xff1a; 确保你已经安装了所需的JDK&#xff0c;并且知道其安装路径。 打开Tomcat的安装目录&#xff0c;在bin目录下找到catalina.bat&#xff08;Windows&#xff09;或catalina.sh&#xff08;…

thinkphp6入门(13)-- 一对多关联模型

定义一对一关联&#xff0c;例如&#xff0c;一个用户都有多个工作经历。 一、两表 1.用户表:user 2.工作经验表&#xff1a;work_experience user表的id关联work_experience表的user_id。 注意看&#xff0c;user_id1的有2条工作经验 二、数据模型 主表模型&#xff1a;…

2023.12.6 关于flask中的route、render_template、redirect的关系问题

2023.12.6 关于flask中的route、render_template、redirect的关系问题 之前对于route、render_template、redirect三者的关系还有一些模糊&#xff0c;测试了一个案例后就比较清晰了&#xff0c;简单来说就是路径、模板和重定向&#xff0c;三者相对独立&#xff0c;只是一般命…

我的创作纪念日-第四年

机缘 不知不觉&#xff0c;CSDN 写博客已经四年了&#xff0c;也伴随了我读研读博的绝大多数时间。最多的时候&#xff0c;还是想记录下自己所走过的路程吧&#xff0c;然后留给后人一点经验借鉴。 实战项目中的经验分享   应该只分享过一篇博文&#xff1a;基于Jetson nan…

如何在 1 天内将网站打造为手机app

为您的网站提供移动应用程序的重要性怎么强调都不为过。随着用户越来越依赖智能手机和平板电脑进行在线活动&#xff0c;将您的网站转变为移动手机app可以显着增强用户体验、提高参与度并扩大您的在线影响力。在这篇博客中&#xff0c;我们将探讨如何快速有效地将网站制作成移动…

【Let‘s Encrypt SSL】使用 acme.sh 给 Nginx 安装 Let’s Encrypt 提供的免费 SSL 证书

安装acme.sh 安装 acme.sh 并设置邮箱用来接受重要通知&#xff0c;如证书快过期未更新通知 curl https://get.acme.sh | sh -s emailmyexample.com执行命令后几秒就安装好了&#xff0c;如果半天没有反应请 CtrlC 后重新执行命令。acme.sh 安装在 ~/.acme.sh 目录下&#xf…

windows 10多用户同时远程登陆配置【笔记】

系统环境&多用户访问情况&#xff1a; 1、【win】【R】键入【gpedit.msc】 2、依次选择【计算机配置】→ 【管理模板】 → 【Windows组件】 → 【远程桌面服务】 → 【远程桌面会话主机】 →【连接】 2.1、右键 【允许用户通过使用远程桌面服务进行远程连接】 编辑 …

C++初阶-vector类的模拟实现

vector类的模拟实现 一、经典的vector类问题1.1 前期准备 二、vector的默认成员函数2.1 构造函数2.1.1 无参构造2.1.2 构造具有n个对象值为val的容器&#xff08;数据类型为模板类型T&#xff09;2.1.3 拷贝构造 2.2 swap&#xff08;operator需要用&#xff09;2.3 复制重载op…

volatile 系列之指令重排序导致的可见性问题

什么是指令重排序呢?为了更加直观地理解&#xff0c;老司机还是通过一个案例来说明 public class MemoryReorderingExample {private static int x0,y0:private static int a0,b0;public static void main(String[] args) throws InterruptedException {int i0;while(true){…

排序算法之一:直接插入排序

1.基本思想 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a; 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 实际中我们玩扑克牌时&#xff0c;就用…

【UML】组件图中的供接口和需接口与面向对象中的接口

UML&#xff08;统一建模语言&#xff09;组件图中的“供接口”&#xff08;Provided Interface&#xff09;和“需接口”&#xff08;Required Interface&#xff09;与面向对象编程中的接口概念有关联&#xff0c;但它们在应用上有所区别。 下面解释两者的关系&#xff1a; …

NCNN 源码学习【一】:学习顺序

最近一段时间一直在做模型部署的工作&#xff0c;主要是利用NCNN部署到安卓端&#xff0c;跟着网上的博客和开源项目&#xff0c;做了很多工作&#xff0c;也学习到很多东西&#xff0c;但是对于NCNN的源码&#xff0c;并没有仔细的研究过&#xff0c;对我来说&#xff0c;仿佛…

C++共享和保护——(2)生存期

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 生命如同寓言&#xff0c;其价值不在于…

改进YOLOv8注意力系列二:结合CBAM、Coordinate Attention、deformable_LKA_Attention可变形大核注意力

改进YOLOv8注意力系列二:结合ACmix、Biformer、BAM注意力机制 代码CBAM注意力Coordinate Attention坐标注意力deformable_LKA_Attention可变形大核注意力加入方法各种yaml加入结构本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代…