一、冒泡排序算法优化
主要思想:如果还没有遍历完所有的趟数就已经排好序了,就设置一个判断信息,结束循环。
具体代码实现如下:
//封装方法:传入类型和数组,按传入的类型升序或者降序
public static void sort(int[] arr,String type) {
//需要遍历arr.length-1次
int n = arr.length;
for(int i=1;i<=n-1;i++) { //i为遍历当前次数
//定义一个标记信息,判断是否排好序了排好序了为true
boolean flag =true;
//每次需比较n-i次
for(int j=0;j<=n-i-1;j++) {//j为每趟需比较的次数,同时为数组的下标
//根据传入的排序类型进行排序
if("升序".equals(type) || "sortUp".equals(type)) {
//比较两个数的大小,并根据情况交换位置,此处需要数组的下标,为当前数于下一个数相比较
if(arr[j]>arr[j+1]) {
//转存arr[numIndex]
int num = arr[j];
//将arr[numIndex+1]的值赋给arr[numIndex]
arr[j]=arr[j+1];
//将arr[numIndex]的值(num)赋给arr[numIndex+1]
arr[j+1]=num;
//如果发生交换,说明还没有排好序,为false
flag = false;
}
}else if("降序".equals(type) || "sortDown".equals(type)){
if(arr[j]<arr[j+1]) {
int num = arr[j];
arr[j]=arr[j+1];
arr[j]=num;
//如果发生交换,说明还没有排好序,为false
flag = false;
}
}else {
throw new RuntimeException("您输入的排序方式有误,请输入“升序”“sortUp”“降序”“sortDown”");
}
}
if(flag) {
System.out.println("排了"+i+"次");
return;
}
}
}
二、二分法查找(折半查找)
1、作用
2、主要思想
(1)查找的数组首先需要进行升序排列
(2)将需要查找的值key与该数组的中间索引的值arr[center]相比较“
1)如果key>arr[center],则下一次的查找范围变成arr[center+1]到arr[end];
2)如果key
4)如果开始下标大于结束下标,则表示该数不在这个数组中。
代码实现如下:
public static void binarySeacher(int[] arr,int num) {//arr表示查找的数组,num:表示要查找的元素
//定义开始和结束下标
int startIdx = 0;
int endIdx = arr.length-1;
//通过循环来查找
while(startIdx<=endIdx) {
//获取中间位置的下标
int centerIdx = (startIdx+endIdx)/2;
//如果该元素大于中间位置的元素值
if(num>arr[centerIdx]) {
//将开始下标设置为:中间位置+1
startIdx = centerIdx+1;
}
//如果该元素小于中间位置的元素值
if(num<arr[centerIdx]) {
//将结束下标设置为:中间位置-1
endIdx = centerIdx - 1;
}
if(num==arr[centerIdx]) {
//等于说明查找到了
System.out.println("该元素存在于数组中,在第"+(centerIdx+1)+"位");
return;//结束方法
}
}
//循环结束后方法还没有结束,说明没有找到该元素
System.out.println("该元素不存在于数组中");
}
三、插入排序法
//int[] nums = {314,298,508,123,486,145};
public static int[] injectionSort(int[] number) {
// 第一个元素作为一部分,对后面的部分进行循环
for (int j = 1; j < number.length; j++) {
//中转变量
int tmp = number[j];
//前一个数的下标
int i = j - 1;
//第一个数大于第二个数,交换位置
while (tmp < number[i]) {
number[i + 1] = number[i];
i--;
if (i == -1)
break;
}
//前一个数小于后一个数,位置不变number[j]=number[i+1]
number[i + 1] = tmp;
}
return number;
}
三、数组API使用
在java.util.Arrays的类中封装了许多方法,供操作数组使用。
注意:这些方法为Arrays的静态方法,需要通过类名Arrays来调用。
以下是一些常用的方法:
1、toString方法
以字符串的形式返回数组的内容。
注意:与Object类的toString方法区分:
1)这里为静态方法,通过类名调用;
2)Object类是成员方法,需通过创建对象来调用。
2、equals方法
比较两个数组的方式是否相等。
注意:与Object类的equals方法区分:
1)这里为静态方法,通过类名调用;
2)Object类是成员方法,需通过创建对象来调用。
3、fill方法
4、copyOf方法
复制数组。
注意:java.lang.System下也有一个复制数组的方法,这个方法更灵活,arraycopy。
5、sort方法
系统默认的排序方式是升序。
(1)基本数据类型:直接比较值的大小排序;
(2)引用数据类型:需要实现Comparable接口,重写comparaTo方法制定比较规则;
(3)自学Comparato。
6、binarySearch方法
四、可变参数
1、当使用一个方法,传入的参数的个数不固定时,可以设置可变参数,这样更加灵活。
2、传入多个参数时,多个参数之间用逗号隔开。
3、可传入数组对象。
4、定义语法:
public 返回值类型 方法名(参数类型…参数名){功能代码}
具体调用该方法时:方法名(数组名) || 方法名(值1,值2,值3…);
5、实质:传入的多个参数,被放进一个数组中,方法需要实现的功能通过遍历数组来实现。
五、StringBuilder和StringBuffer
字符串对象有三种:String类 \ StringBuilder类 \StringBuffer类。
1、String类
(1)String是不可变字符串。
(2)String对象存放的字符串内容是不可变的,底层的char是用final修饰的。在作相关操作的时候,只能产生新的字符串,不能在原字符串上修改。
2、StringBuilder类
(1)StringBuilder是可变字符串。线程不安全,效率高,使用较多。
(2)StringBuilder存放的字符串内容是可变的,在作相关操作的时候是在原字符串上修改,因此可以节约处理时间和存储空间。
(3)StringBuilder的常用API使用(和String类大同小异)
1)append():追加
2)delete():删除
3)insert():插入
4)reverse():倒序
5)toString():转成String对象。
也可以用StringBuilder sb = new StringBuilder(需要转化的String对象);
6)replace():替换字符串内容
7)charAt():取出字符
3、 StringBuffer类
(1)StringBuffer是可变字符串。线程安全,效率低,使用较少。
(2)StringBuffer存放的字符串内容是可变的,在作相关操作的时候是在原字符串上修改,因此可以节约处理时间和存储空间。