数组扩容以及优化的冒泡排序法

关于数组扩容

,我们通常用到的地方可能就是关于对于数组的处理,比如对于指定的索引位置,我们需要删除这个元素,也有可能就是增加元素,那么在增加元素的过程中,原数组的大小已经固定,我们就需要对其进行扩容。
在这里我们封装一个方法,可在main中调用(实际这个方法在之前并没有进行封装处理,为了测试其他元素故进行封装处理)

在这里插入图片描述

然后我再调用,这里我们可以看到,扩容的本质其实就是重新定义一个对象数组,在之前的length加上需要的大小
在这里插入图片描述

下面关于是冒泡排序方法

的优化处理,我们知道,冒泡方法的原理就是逐一比较大小在这里直接给出代码,进行解释
在这里插入图片描述
在这里,我们看到是j<a,lengthj-1-i,那么为什么减去i,原因是因为我们可以省略重复的比较步骤,比如说,在算法的某一步我们已经得到2,1,0,4,5,6,但是由于算法的问题这一个步骤会重复处理,我们在之前的for循环定义的i减去之后便可以省略。

另外还有一个优化的问题就是在这行代码的前面,我们定义了一个boolean类型的变量f,这个和为什么减去i类似,不过解释起来更容易,比如说我们已经将0123456排序好但是这是i并没有到最大值,由于算法的问题,计算机仍然需要将i的值处理到i<a.length-1为止,我们定义的这个boolean类型的f,原理是如果检测到有进行交换,那么此时f的值为false,如果检测到f的值为true,也就是没有交换,那么我们就break,结束循环推出。

关于这两个方面的优化,解释的有不到位的地方请谅解,大家尽量手动敲敲代码试试看,随机定义一个数组,然后将代码这样写进行一下比较就能体会到了。下面为测试没有优化的冒泡排序法的代码

在这里插入图片描述

/* * 基于可扩充数组的向量实现 */ package dsa; public class Vector_ExtArray implements Vector { private int N = 8;//数组的容量,可不断增加 private int n;//向量的实际规模 private Object A[];//对象数组 //构造函数 public Vector_ExtArray() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;并返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (N <= n) {//空间溢出的处理 N *= 2; Object B[] = new Object[N];//开辟一个容量加倍的数组 for (int i=0; ir; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n-1; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值