Java之数组应用-选择排序-插入排序

已经完全掌握了冒泡排序和二分查找的同学,可以自己尝试学习选择、插入排序。不要求今天全部掌握,最近2-3天掌握即可!

1 选择排序

选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾,最终完成排序。

选择排序算法描述:

  1. 初始状态:无序区间为 Arr[0.1…n],有序区间为空;
  2. 第i==1趟排序开始,从无序区中选出最小的元素Arr[k],将它与无序区的第1个元素交换,从而得到有序区间Arr[0…i-1],无序区间Arr[i…n];
  3. 继续后面第i趟排序(i=2,3…n-1),重复上面第二步过程;
  4. 第n-1趟排序结束,数组排序完成。

选择排序过程如下图:

在这里插入图片描述

源码实现:

import java.util.Arrays;public class Test07_SelectSort {public static void main(String[] args) {//准备一个int数组int[] array = {5, 2, 6, 5, 9, 0, 3};System.out.println("排序前: "+ Arrays.toString(array));//插入排序selectionSort(array);//输出排序结果System.out.println("排序后: "+ Arrays.toString(array));}public static void selectionSort(int[] arr) {int len = arr.length;if(len <= 1)return;//外层循环控制总体排序次数for(int i = 0; i < len-1; i++) {			int minIndex = i;//内层循环找到当前无序列表中最小下标for(int j = i + 1; j < len; j++) {if(arr[minIndex] > arr[j]) {minIndex = j;}}//将无需列表中最小值添加到 有序列表最后位置if(minIndex != i) {arr[minIndex] = arr[minIndex] ^ arr[i];arr[i] = arr[minIndex] ^ arr[i];arr[minIndex] = arr[minIndex] ^ arr[i];}//System.out.println(Arrays.toString(arr));}}
}

2 插入排序

插入排序(Insertion Sort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。

插入排序算法描述:

  1. 将数组分成两部分,已排序、未排序区间,初始情况下,已排序区间只有一个元素,即数组第一个元素;
  2. 取未排序区间中第一个元素,插入到已排序区间中合适的位置,这样子就得到了一个更大的已排序区间;
  3. 重复这个过程,直到未排序区间中元素为空,算法结束。

插入排序过程见下图:
在这里插入图片描述

源码实现:

import java.util.Arrays;public class Test07_InsertSort { public static void main(String[] args) {//准备一个int数组int[] array = {5, 2, 6, 5, 9, 0, 3};System.out.println("排序前: "+ Arrays.toString(array));//插入排序insertionSort(array);//输出排序结果System.out.println("排序后: "+ Arrays.toString(array));}public static void insertionSort(int[] arr) {int len = arr.length;if(len <= 1) {return;}//外层循环控制 总体循环次数for(int i = 1; i < len; i++) {//内层循环做的事情:将无序列表中第一个元素插入到有序列表中合适位置int value = arr[i];//获取有序列表中最后一个元素下标int j = i - 1;for(; j >= 0; j--) {if(value < arr[j]) {arr[j+1] = arr[j];}else {break;}}//将需要插入的元素 放置到合适位置arr[j+1] = value;//一次排序完成后,输出 方便 观察System.out.println(Arrays.toString(arr));}}
}

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

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

相关文章

Mysql备份恢复

目录 1.Mysql日志管理 1.1为什么需要日志 1.2日志作用 1.3数据丢失或破坏的原因 1.4常见日志类型之错误日志 1.5常见日志类型之通用查询日志 1.6常见日志类型之慢查询日志 1.7常见日志类型之二进制日志 1.8常见日志类型之事务日志 2.MySQL备份 2.1备份类型 2.2逻辑…

超低功耗ARM Cortex-M33 TZ MCU STM32WBA54、STM32WBA55:通过提升无线性能实现更出色的用户体验

摘要 STM32WBA54、STM32WBA55产品系列同时支持多种无线标准&#xff0c;包括Bluetooth低功耗 5.4&#xff08;已认证&#xff09;、Zigbee、Thread以及可用作Thread边界路由器的Matter。 该产品系列具有出色的灵活性和更强的安全性&#xff0c;可帮助开发人员应对不断变化的无…

新能源汽车的充电网络安全威胁和防护措施

1. 物理攻击&#xff1a;例如恶意破坏、搬走充电设施等&#xff0c;这可能会对充电设施造成损害&#xff0c;妨碍正常的电力传输。 2. 网络攻击&#xff1a; 黑客可能利用系统漏洞攻击网络&#xff0c;破坏设备&#xff0c;并窃取用户的个人信息、支付信息等&#xff1b; 车辆…

24暑假算法刷题 | Day21 | LeetCode 669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

目录 669. 修剪二叉搜索树题目描述题解 108. 将有序数组转换为二叉搜索树题目描述题解 538. 把二叉搜索树转换为累加树题目描述题解 669. 修剪二叉搜索树 点此跳转题目链接 题目描述 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪…

企业邮件系统管理(二)配置与优化指南

文章目录 企业邮件系统管理&#xff1a;配置与优化指南引言第一部分&#xff1a;了解邮件系统的基础架构一、MTA与MUA的定义及作用二、常见的邮件协议 第二部分&#xff1a;Exchange Server 2010的核心功能一、Exchange Server的服务器角色二、“典型安装”包含的服务器角色三、…

packet_write_wait: Connection to <IP> port <PORT>: Broken pipe

packet_write_wait: Connection to <IP> port <PORT>: Broken pipe 是一个常见的网络错误&#xff0c;指的是尝试向一个已经损坏的 TCP 连接写入数据。下面是这个错误的一些可能原因和解决方法&#xff1a; 可能的原因&#xff1a; 客户端断开连接&#xff1a; 远…

vite环境下使用bootstrap

环境 nodejs 18 pnpm 初始化 pnpm init pnpm add -D vite --registry http://registry.npm.taobao.org pnpm add bootstrap popperjs/core --registry http://registry.npm.taobao.org pnpm add -D sass --registry http://registry.npm.taobao.org新建vite.config.js cons…

【git】如何实现规范git commit -m的格式

.husky/commit-msg #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"yarn commitlint --edit $1.vscode/settings.json "ahooks","aliyuncs","antd","commitlint", // 新增"deadcode","deno…

用三行代码“偷袭白嫖党”,保护自己的代码(多语言实现)

计算机科学专业的同学们最近遇到了一件烦心事。教授布置了一系列具有挑战性的编程作业&#xff0c;需要大家运用所学知识来完成。然而&#xff0c;一些同学却动起了歪脑筋&#xff0c;想要通过抄袭他人的代码来轻松完成任务。 小李、小王和小张是同宿舍的好友&#xff0c;他们…

第1课:计算机历史与基础——一段跨越时代的技术演进

目录 引言计算机的起源机械计算时代 电子计算机的曙光个人计算机的革命现代计算机的多样化计算机的分类计算机的特点计算机技术的未来发展结语 引言 在数字化浪潮的推动下&#xff0c;计算机已经成为现代社会的中枢神经。它们不仅驱动着我们的工作流程&#xff0c;更深入地影响…

四、GD32 MCU 常见外设介绍(1)RCU 时钟介绍

系统架构 1.RCU 时钟介绍 众所周知&#xff0c;时钟是MCU能正常运行的基本条件&#xff0c;就好比心跳或脉搏&#xff0c;为所有的工作单元提供时间 基数。时钟控制单元提供了一系列频率的时钟功能&#xff0c;包括多个内部RC振荡器时钟(IRC)、一个外部 高速晶体振荡器时钟(H…

【力扣习题】C语言

目录 【876.链表的中间点】 思路&#xff1a; 【83删除排序链表中的重复元素】 思想&#xff1a; 代码&#xff1a; 【876.链表的中间点】 思路&#xff1a; 1、计算链表的长度 2、遍历到链表中间长度并输出值 /*** Definition for singly-linked list.* struct ListN…

如何提升短视频的曝光量和获客效能?云微客来解决

在流量至上的当下&#xff0c;短视频凭借其优势&#xff0c;迅速成为了众多企业获客引流的核心营销手段。进入短视频赛道后&#xff0c;如何提升短视频的曝光量和获客效能&#xff0c;就成为了众多企业亟待解决的焦点。 如果你不想投入大量的广告预算&#xff0c;还想在短视频平…

【GoF23种设计模式+简单工厂模式】

一、设计模式概述与类型 1.1、设计模式的一般定义&#xff1a; 设计模式&#xff08;Design Pattern&#xff09;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结&#xff0c;使用设计模式是为了可重用代码&#xff0c;让代码更容易被他人理解并且保证代…

【Linux】进程间通信及管道详细介绍(上)

前言 本节我们开始学习进程间通信相关的知识&#xff0c;并详细探讨一下管道&#xff0c;学习匿名管道和命名管道的原理和代码实现等相关操作… 目录 1. 进程间通信背景1.1 进程通信的目的&#xff1a; 2 管道的引入&#xff1a;2.1 匿名管道&#xff1a;2.1.1 匿名管道的原理&…

【中项】系统集成项目管理工程师-第5章 软件工程-5.1软件工程定义与5.2软件需求

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

【数据结构】AVL树(图文解析 + 代码实现)

目录 1、AVL树的概念 2、AVL树结点的定义 3、AVL树的插入 4、AVL树的旋转 4.1 左单旋 4.2 右单旋 4.3 右左双旋 4.4 左右双旋 5、AVL树的验证 6、AVL树的性能 前面对map/multimap/set/multiset进行了简单的介绍&#xff0c;会大仙&#xff0c;这几个容器有个共同点是…

sklearn基础学习

1. 简介 1.1 什么是sklearn sklearn&#xff0c;或者更正式地称为scikit-learn&#xff0c;是一个基于Python的开源机器学习库。它建立在NumPy、SciPy和matplotlib之上&#xff0c;提供了简单而有效的工具用于数据挖掘和数据分析。sklearn支持监督学习和无监督学习算法&#…

使用 jQuery 中的 this 实例

在 jQuery 中&#xff0c;this 关键字用于表示指向当前操作的 DOM 元素。本篇博客将详细介绍如何在 jQuery 中使用 this 实例。 一、选择器中的 this 在选择器中&#xff0c;this 可以方便地指向当前操作的 DOM 元素。例如&#xff0c;当用户点击一个按钮时&#xff0c;我们想…

【Linux常用命令】之find命令

Linux常用命令之find命令 文章目录 Linux常用命令之find命令常用命令之find背景介绍 总结 作者简介 听雨&#xff1a;一名在一线从事多年研发的程序员&#xff0c;从事网站后台开发&#xff0c;熟悉java技术栈&#xff0c;对前端技术也有研究&#xff0c;同时也是一名骑行爱好…