当前位置: 首页 > news >正文

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));}}
}

相关文章:

  • Hyperledger顶级项目特点和介绍
  • java8函数式编程学习(一):lambada表达式和stream流的使用
  • Vue学习---vue 防抖处理函数,是处理什么场景
  • leetcode刷题日记-岛屿数量
  • OpenTeleVision复现及机器人迁移
  • 实验八: 彩色图像处理
  • Winform上位机TCP客户端/服务端、串口通信
  • Elasticsearch:Golang ECS 日志记录 - zerolog
  • 【PyTorch】单目标检测项目部署
  • js+css侧边导航菜单 可收缩
  • 【数据结构】排序算法——Lesson2
  • 树莓派自制智能语音助手之语音唤醒
  • 《人生苦短,我用python·十一》python网络爬虫的简单使用
  • 基于Hutool实现自定义模板引擎,实现json个性化模板引擎转换
  • 机器学习 | 回归算法原理——最小二乘法
  • 分享的文章《人生如棋》
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • hadoop集群管理系统搭建规划说明
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Linux后台研发超实用命令总结
  • Lucene解析 - 基本概念
  • Promise面试题,控制异步流程
  • Rancher如何对接Ceph-RBD块存储
  • vue 配置sass、scss全局变量
  • 分布式事物理论与实践
  • 构造函数(constructor)与原型链(prototype)关系
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何设计一个微型分布式架构?
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 通过几道题目学习二叉搜索树
  • 线性表及其算法(java实现)
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 7行Python代码的人脸识别
  • 容器镜像
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • #APPINVENTOR学习记录
  • #宝哥教你#查看jquery绑定的事件函数
  • #在 README.md 中生成项目目录结构
  • (6)设计一个TimeMap
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (env: Windows,mp,1.06.2308310; lib: 3.2.4) uniapp微信小程序
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (回溯) LeetCode 78. 子集
  • (五)c52学习之旅-静态数码管
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)iOS字体
  • (转)linux 命令大全
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) UML中文FAQ (OO) (UML)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库