一、冒泡排序算法优化
主要思想:如果还没有遍历完所有的趟数就已经排好序了,就设置一个判断信息,结束循环。
具体代码实现如下:
//封装方法:传入类型和数组,按传入的类型升序或者降序public static void sort(int[] arr,String type) {//需要遍历arr.length-1次int n = arr.length;for(int i=1;i<=n-1;i++) { //i为遍历当前次数//定义一个标记信息,判断是否排好序了排好序了为trueboolean 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;//如果发生交换,说明还没有排好序,为falseflag = 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;//如果发生交换,说明还没有排好序,为falseflag = 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]) {//将开始下标设置为:中间位置+1startIdx = centerIdx+1;}//如果该元素小于中间位置的元素值if(num<arr[centerIdx]) {//将结束下标设置为:中间位置-1endIdx = 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存放的字符串内容是可变的,在作相关操作的时候是在原字符串上修改,因此可以节约处理时间和存储空间。
