Java动态数组及数组排序的三种常用方法
一、动态数组
1、数组的定义:
用于存储相同数据类型的一组连续的存储空间
2、数组的特点:
数组的长度一旦定义,则不可改变
访问数组的元素需要通过下标(索引)访问,下标从0开始
数组是引用数据内存,内存分布在堆内存中,数组的变量存储的内存地址
3、动态数组:
由于数组的长度定义后不能改变,所谓“动态数组”是可以增加数组的长度,所以Java实现动态数组是改变数组变量指向不同的内存地址。 本质并没有将数组的长度改变。
动态数组的本质:将内存空间的改变,以及指向数组内存的地址改变
操作1:给数组添加新元素,可添加在最后面,也可添加到指定位置
/**
*添加元素(添加到末尾)
*/
public static int [] addEle(int [] array,int num){
//目标数组 添加的原始
//int [] array={10,9,3,2,1};
//1、创建临时数组的变量
int [] tempArray =new int[array.length+1];
//2、将目标数组的元素copy到临时数组的内存中
for(int i=0;i<array.length;i++){
tempArray[i]=array[i];
}
//3、将添加的元素放入临时数组中
tempArray[tempArray.length-1]=num;
//4、将目标数组的地址指向临时数组的地址
array=tempArray;//由于tempArray是局部变量,方法执行完内存自动回收,如果不返回 没有地址指向tempArray的内存,如果返回并接收,说明这块内存仍然有用。
return array;
}

/**
* 将元素num 添加到指定index的位置
* @param arr
* @param num
* @param index
* @return
*/
public static int [] addEle(int [] arr , int num ,int index){
// 1、创建临时数组的大小
int [] tempArray = new int[arr.length+1];
//2、遍历arr
for(int i = 0 ; i<=arr.length;i++){
// 如果i<index
if(i<index){
tempArray[i] = arr[i];
}else if(i==index){ // 2
tempArray[i] = num;
}else{ // i > index
// i=3 arr[i-1] 10 9 3 2 1 -> 10 9 5 3 0 0
// i =4 array[i-1] 2-> 10 9 5 3 2 0
// i=5 array[4] 1 -> 10 9 5 3 2 1
tempArray[i] = arr[i-1];
}
}
// 赋值
arr = tempArray;
return arr;
}
操作2: 删除元素 ,删除指定下标的元素
/**
* 删除指定下标的元素
* @param arr 目标数组
* @param index 删除的下标
* @return 删除之后的数组
*/
public static int [] removeEle(int [] arr, int index){
// 1、创建一个临时数组 用于存放删除后的元素
int [] tempArray = new int [arr.length-1];
// 2、遍历目标数组
for(int i = 0 ;i<arr.length;i++){
if(i<index){
tempArray[i] = arr[i];
}else if(i==index){
continue;
}else {//i>index
tempArray[i-1] = arr[i];
}
}
// 3 将目标数组的地址变换成 新数组的地址
arr=tempArray;
return arr;
}
二、数组的排序
排序:将一组数列(无序的)按照从小到大或者从大到小的顺序排列。

1、冒泡排序
从第一个数开始,与它相邻的数比较,较大(或较小)的数放在后面,最终比较一轮之后,得出最大(或最小)的数放在最后
比较思路:
冒泡排序的规则
* 1、从第一个数开始,将这个数 与它相邻的数比较 ,如果 这个数大于它相邻的数
* 则两个数交换位置
* i=0 相邻i=1
* 2、依次 从第二个数开始,再将这个数与它相邻的数比较,如果第二个数大于相邻的数
* 则继续交换
* 依次类推, 到倒数第二个截止 ,直到将最大的数放在最后面
* 3、重复以上1,2步骤
/
public static void main(String[] args) {
int [] array = {5,4,3,2,1};
//用于交换的临时变量
int temp=0;
for(int j =0;j<array.length-1;j++) {
for (int i = 0; i < array.length -j-1; i++) {
// 相邻的数比较
if (array[i] > array[i + 1]) {
temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
}
}
System.out.println("比较一轮之后:" + Arrays.toString(array));
}
}
2、选择排序
/**
* 选择排序: 从一堆数中选择一个最小数 放在第一个位置,再从一堆数中选择一个
* 最小数放在第二个位置, 依次 将一堆数的最小数按顺序排放。
* 步骤: 1、假设第一个数是最小数,需要定义最小数的下标minIndex=0
* 将这个数与后面的每一个数比较,找到最小数的下标即可
* 2、将第一个数与最小数的下标交换 ,得出最小数在第一位。
* 3、 依次类推, 将已比较的数 忽略,继续从剩下的元素中找足最小数,放入已比较的数的下一位
* 直到整个数列比较结束
* @param args
*/
public static void main(String[] args) {
int [] array = {3,2,1,5,7,4};
for(int j=0;j<array.length-1;j++) {
// 假设第一个数是最小数
int minIndex = j;
// 为什么i =j+1 因为初始值要略过已比较的下标
for (int i = 1+j; i < array.length; i++) {
if (array[minIndex] > array[i]) {
minIndex = i;
}
}
// 将这个最小数放在 第一位
int temp = 0;
temp = array[j];
array[j] = array[minIndex];
array[minIndex] = temp;
System.out.println("----第一次完成后:" + Arrays.toString(array));
}
System.out.println("最后的排序:"+Arrays.toString(array));
}
}
3、插入排序
/**
* 插入排序
* 1、从第一个元素开始,假设第一个元素是已排好序的
* 2、从下一个元素开始,依次比较它前面的所有元素(从后向前扫描)
* 3、 如果这个元素 小于它前面的元素 则两两交换 ,
* 如果这个元素 大于它前面的元素,则不交换
* 4、依次重复2,3步骤 ,直到将所有数 比较完成
* 5,4,3,2,1
*
* 4 5 3 2 1 i从1开始
*
* 4 3 5 2 1 i从2开始
* 3 4 5 2 1
*
* 3 4 2 5 1 i从3开始
* 3 2 4 5 1
* 2 3 4 5 1
*
* 2 3 4 1 5 i从4开始
* 2 3 1 4 5
* 2 1 3 4 5
* 1 2 3 4 5
* @param args
*/
public static void main(String[] args) {
int [] array = {5,4,3,2,1};
// 外层循环循环 每一个数的比较次数
for(int j=0;j<array.length-1;j++) {
int temp = 0;
for (int i = 1+j; i > 0; i--) {
if (array[i] < array[i - 1]) {
temp = array[i];
array[i] = array[i - 1];
array[i - 1] = temp;
}
}
System.out.println("每一次完成后的结果:"+ Arrays.toString(array));
}
System.out.println("最后一次完成后的结果:"+Arrays.toString(array));
}
Java动态数组及数组排序的三种常用方法的更多相关文章
- Java动态数组
其中java动态数组: Java动态数组是一种可以任意伸缩数组长度的对象,在Java中比较常用的是ArrayList,ArrayList是javaAPI中自带的java.util.ArrayList. ...
- 三 基于Java动态数组手写队列
手写队列: package dataStucture2.stackandqueue; import com.lt.datastructure.MaxHeap.Queue; import dataStu ...
- 常用数据结构-线性表及Java 动态数组 深究
[Java心得总结六]Java容器中——Collection在前面自己总结的一篇博文中对Collection的框架结构做了整理,这里深究一下Java中list的实现方式 1.动态数组 In compu ...
- java动态数组笔记
动态数组: 在java.lang.reflect包下提供了Array类,包括一系列static方法,通过这些方法可动态的创建数组.给元素赋值.取出元素值等等 //理解数组引用——下面定义的objs数组 ...
- 二 基于java动态数组手写栈
package dataStucture2.stack; import dataStucture2.array.MyDynamicArray; /** * 基于动态数组手写栈 * 设计时,栈中仅栈顶对 ...
- java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四
前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- 有关Java动态数组的一个小问题
前言 问题描述 今天遇到一个关于集合的问题,觉得比较有趣,记录一下,这个问题是:定义一个用户类,至少包含姓名,年龄,生日,qq邮箱,初始化10个用户,利用String操作,提取qq到List集合中,姓 ...
- java 动态数组
package testjavapro; import java.util.*; public class testjava { public static void main(String args ...
- 十七、Java中数组常见的几种排序方法!
转载自:https://www.cnblogs.com/bekeyuan123/p/6891875.html 数组的定义: // 3种定义方式 int[] arr = new int[5]; int[ ...
- 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解
数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
随机推荐
- maui BlazorWebView+本地html (vue、uniapp等都可以) 接入支付宝sdk 进行支付宝支付 开发 Android app
首先添加支付宝sdk的绑定库 nuget 包:Chi.MauiBinding.Android.AliPay 项目地址:https://github.com/realZhangChi/MauiBindi ...
- Solon Initializr v1.2 发布
Solon Initializr 是 Solon 框架的模板生成器项目.本期更新增加了快捷组合包的依赖选择,并生成对应的项目模板. 更新说明 增加 Solon Lib 依赖选择,并生成对应项目 增加 ...
- MQTT(EMQX) - Java 调用 MQTT Demo 代码
POM <dependency> <groupId>org.eclipse.paho</groupId> <artifactId>org.eclipse ...
- Linux服务器MySQL操作总结
目录 1. Navicat连接服务器MySQL 2. 如何查看MySQL用户名和密码 3. 修改MySQL的登录密码 4. 安装MySQL开发包(Centos7版) 错误:error 1045 (28 ...
- Tkinter库的使用
from tkinter import *import tkinter as tkfrom tkinter import Tk, Label,ttkfrom PIL import Image, Ima ...
- Java设计模式 —— 适配器模式
9 适配器模式 9.1 结构型模式 结构型模式(Structural Pattern) 关注如何将现有类或对象组织在一起形成更强大的结构.结构型模式根据描述目标不同可以分为两种: 类结构型模式:关心类 ...
- redis 基于 漏斗算法 实现对 api 的限流
漏斗算法 漏桶算法的原理: 漏桶有一定的容量,给漏桶注水,当单位时间内注入水量大于流出水量,漏桶内积累的水就会越来越多,直到溢出. 就好比大批量请求访问nginx相当于注水,nginx根据配置按照固定 ...
- Java GC基础知识
对象存活判断 引用计数 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用失效时,计数器值就减一:任何时刻计数器为零的对象就是不可 能再被使用的 引用计数法的缺陷: publi ...
- 宝塔ftp无法连接的解决方案
宝塔面板现在使用率非常的高.今天把自己的踩坑处理方法记录一下. 在配置号宝塔面板ftp后,使用vscode的sftp插件,发现一直链接不上.一度以为自己配置文件,配置的参数有问题.各种度娘后,花了好长 ...
- 31-dll
webpack.dll.js /** * 使用dll技术,对某些库(第三方库:jquery.react.vue...)进行单独打包 * 当你运行 webpack 时,默认查找 webpack.conf ...