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源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...
随机推荐
- 如何在 Apinto 实现 HTTP 与gRPC 的协议转换 (下)
上文给大家详细介绍了在 Apinto 上实现 HTTP 与 gRPC 的协议转换的基本内容,本篇我们将继续讲解如何在 Apinto-Dashboard 中进行配置. 配置 Apinto Apinto ...
- Python的安装与配置(图文教程)
安装Python 想要进行Python开发,首先需要下载和配置Python解释器. 下载Python 访问Python官网: https://www.python.org/ 点击downloads按钮 ...
- RochyLinux 8.6安装Oracle19c Client
一.环境准备 1.1 软件下载 下载地址:https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html 其中c ...
- 免费1年服务器,部署个ChatGPT专属网页版
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 白皮袄个免费1年服务器,部署个ChatGPT专属网页版! api.openai.com por ...
- 华为 A800-9000 服务器 离线安装MindX DL
MindX DL(昇腾深度学习组件)是支持 Atlas 800 训练服务器.Atlas 800 推理服务器的深度学习组件参考设计,提供昇腾 AI 处理器资源管理和监控.昇腾 AI 处理器优化调度.分布 ...
- python之PySimpleGUI(二)属性
属性 Size• Key 相当于句柄/ID• Font• Pad• Colors• Enable Events• Visibility• Tooltip• Metadata• Right click ...
- Ubuntu20.04 Docker搭建远程xfce桌面以及ssh教程
简介:本文主要介绍ubuntu20.04容器中搭建xfce远程桌面.C++.Go环境.容器内docker操作配置. 一.创建容器1.创建容器 docker pull ubuntu:20.04docke ...
- 在.NET 6.0中自定义接口路由
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本文中,我们将讨论ASP.NET Core中的新路由.我们将了解什么是接口(en ...
- Rocky Linux 初体验
简介 Rocky Linux 是 CentOS 的一个分支,它位于 Red Hat Enterprise Linux(RHEL) 的下游.与 CentOS 一样,它提供了非常适合服务器的稳定版 Lin ...
- Java:Should I use a `HashSet` or a `TreeSet` for a very large dataset?
这是StackOverflow上一个有意思的提问,记录一下. 原地址在这 翻译: 对于大型数据集,应该使用"哈希集"还是"树集"? (因为HashTable有着 ...