Java第四周总结

一、排序

1.冒泡排序

(1)原理:比较相邻的元素。如果第一个比第二个大,就交换他们两个,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
(2)优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个两个元素中最大值,一定程度上减少了算法的量。
(3)例子
代码附上:

import java.util.*;
class BubbleSort{
    public static void main(String[] args){
        int[] a={9,8,15,2,4,7,19};
        for(int i=0;i<a.length-1;i++){
            for(int j=0;j<a.length-1-i;j++){
                if(a[j]>a[j+1]){
                    swap(a,j,j+1);
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
      
    }
}

(4)时间复杂度
如果数据正序,只需要走一趟即可完成排序。所需的比较次数为n-1,记录移动次数0,冒泡排序最好的时间复杂度为O(n)。如果数据反序,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。此时比较次数为O(n^2)移动次数为O(nn),且都达到最大。冒泡排序总的平均时间复杂度为:O(nn) ,时间复杂度和数据状况无关。

2.选择排序

(1)原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(或最大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。
(2)优点:数据较小时,比冒泡排序所需时间少。
(3)例子:
代码附上:

import java.util.*;
class SelectSort{
    public static void main(String[] args){
        int[] a={9,8,15,2,4,7,19};
        for(int i=0;i<a.length-1;i++){
            for(int j=i+1;j<a.length;j++){
                if(a[i]>a[j]){
                    swap(a,i,j);
                }
            }
        }
        System.out.println(Arrays.toString(a));
    }
    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

(4)时间复杂度:O(n^2)

3.插入排序

(1)原理:从第二个元素开始一直往后,如果有数比当前面元素的值大,则将这个数的位置往后挪,直到当前外层元素的值大于或等于它前面的位置为止.这具算法在排完前k个数之后,可以保证a[1…k]是局部有序的,保证了插入过程的正确性。(只要前面元素小于当前元素,就可以证明前面的元素有序且都小于当前元素)
(2)优点:避免了一些不必要的比较,节省了时间。
(3)例子:
代码附上:

  import java.util.*;
class InsertSort{
    public static void main(String[] args){
        int[] a={9,8,15,2,4,7,19};
        for(int i=1;i<a.length;i++){
            int e=a[i];//优化不必要的交换位置
            int j=i;
            while(j>0&&a[j-1]>e){
                a[j]=a[j-1];
                j--;
            }
            a[j]=e;
        }
        System.out.println(Arrays.toString(a));
    }
    public static void swap(int[] a,int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

(4)时间复杂度:O(n^2)

二、格式化输出

(1)System.out.printf方法可以对数据进行格式化输出,如System.out.printf("%-3d",i)。
(2)printf方法常用格式说明:
%c 单个字符、%d 十进制整数、%f 十进制浮点数、%o 八进制数、%s 字符串、%u 无符号十进制数、%x 十六进制数、%% 输出百分号%.
(3)用于printf的标志:

  • 打印数字前的符号、- 左对齐、0 在数字前补0、space 在正数之前加空格、( 负数括在括号内 、, 添加分组分隔符、#(for f ) 包含小数点、#(for x or o) 添加前缀 0x 或 0、^ 转化为大写 。
    (4)例子:
    代码附上:
class geshihua{
    public static void main(String[] args){
        double i=1;
        System.out.printf("%.5f",i);
        System.out.println();
        System.out.println(i);
    }
}

由上可得:println方法输出双精度浮点数时,不能对小数的有效位数控制输出,printf方法可以控制小数有效位数的输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值