1. 程式人生 > >一維陣列的排序及二維陣列

一維陣列的排序及二維陣列

一維陣列的排序及二維陣列

一 . 陣列的三個簡單排序:

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迴圈裡嵌套了一個一維陣列的拷貝;