一维数组的排序及二维数组

一维数组的排序及二维数组

一 . 数组的三个简单排序:

1.冒泡排序:

public static void bubbleSort(int[] array) {
        for(int i=0;i<array.length-1;i++) {
            for(int j=0;j<array.length-1-i;j++) {
                if(array[j]>array[j+1]){
                    int tmp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=tmp;
                }
            }
        }
    }

最坏的情况就是两个for循环都执行完毕,时间复杂度为O(n^2);

 public static void bubbleSort(int[] array) {
        int tmp = 0;
        boolean swap = false;
        for(int i = 0;i < array.length-1;i++) {
            for(int j = 0;j < array.length-1-i;j++) {
                if(array[j] > array[j+1]) {
                    tmp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = tmp;
                    swap = true;
                }
            }
            if(!swap) {
                break;
            }
        }
    }

这是优化的排序算法,可以看出,如果有序数组的话,它只执行一次for循环就结束了;

即最好的情况是这个数组本来就是有序数组(从小到大),时间复杂度:O(n);

稳定性:稳定

2.直接插入排序

 public static void insertSort(int[] array) {
        for(int i=1;i<array.length;i++) {
            int tmp=array[i];
            int j=0;
            for(j=i-1;j>=0;j--){
                if(tmp<array[j]){
                    array[j+1]=array[j];
                }else{
                    break;
                }
            }
            array[j+1]=tmp;
             if(!swap) {
                break;
            }
        }
    }

最坏的情况就是两个for循环都执行完毕,时间复杂度为O(n^2);

 public static void insertSort(int[] array) {
        boolean swap = false;
        for(int i=1;i<array.length;i++) {
            int tmp=array[i];
            int j=0;
            for(j=i-1;j>=0;j--){
                if(tmp<array[j]){
                    array[j+1]=array[j];
                    swap = true;
                }else{
                    break;
                }
            }
            array[j+1]=tmp;
            
        }
    }

这是优化的排序算法,可以看出,如果有序数组的话,它只执行一次for循环就结束了;

即最好的情况是这个数组本来就是有序数组(从小到大),时间复杂度:O(n);

稳定性:稳定

3.选择排序

public static void chooseSort(int[] array) {
        for (int i=0;i<array.length;i++) {
            for(int j=i+1;j<array.length;j++) {
                if(array[j]<array[i]){
                    int tmp=array[i];
                    array[i]=array[j];
                    array[j]=tmp;
                }
            }
        }
    }

时间复杂度O(n);

稳定性:不稳定;

二. 二维数组

1.在C语音中,数组的理解是这样的:

在这里插入图片描述

2.在Java中 数组的理解是:

它并不是一个i行j列的一个表;这点要额外注意;
在这里插入图片描述

在一维数组中,详细写了四个数组拷贝,二维数组也不例外,for()循环,Object.clone(),Arrays.copyOf(),System.Arraycopy()的基本数据类型都为深拷贝,引用数据类型都为浅拷贝;

for循环:

 for (int i=0;i<array.length;i++) {
            for (int j=0;j<array[i].length;j++){
                brray[i][j]=array[i][j];
            }
        }

如果是引用数据类型

        TestArray[][] t1=new TestArray[2][2];
        t1[0][0]=new TestArray();
        t1[0][1]=new TestArray();
        t1[1][0]=new TestArray();
        t1[1][1]=new TestArray();
        TestArray[][]t2=new TestArray[2][2];
        for(int i=0;i<t1.length;i++) {
            for (int j=0;j<t1[i].length;j++){
                t2[i][j]=t1[i][j];
            }
        }

同样的:

        TestArray[][] t1=new TestArray[2][2];
        t1[0][0]=new TestArray();
        t1[0][1]=new TestArray();
        t1[1][0]=new TestArray();
        t1[1][1]=new TestArray();
        TestArray[][]t2=new TestArray[2][2];
        for(int i=0;i<t1.length;i++){
            t2[i]=t1[i].clone();
        }
        TestArray[][] t1=new TestArray[2][2];
        t1[0][0]=new TestArray();
        t1[0][1]=new TestArray();
        t1[1][0]=new TestArray();
        t1[1][1]=new TestArray();
        TestArray[][]t2=new TestArray[2][2]; 
        for(int i=0;i<t1.length;i++){
            t2[i]=Arrays.copyOf(t1[i],t1[i].length);
        }
        TestArray[][] t1=new TestArray[2][2];
        t1[0][0]=new TestArray();
        t1[0][1]=new TestArray();
        t1[1][0]=new TestArray();
        t1[1][1]=new TestArray();
        TestArray[][]t2=new TestArray[2][2];
       for(int i=0;i<t1.length;i++){
            System.arraycopy(t1[i],0,t2[i],0,t1.length);
        }

可以看出,二维数组的拷贝,其实可以看成一个for循环里嵌套了一个一维数组的拷贝;

猜你喜欢

转载自blog.csdn.net/qq_39602004/article/details/83276886