1. 程式人生 > >排序和二維陣列

排序和二維陣列

排序

排序是資料處理中十分常見的且核心的操作,簡單介紹最基礎的三種排序:氣泡排序、直接插入排序、選擇排序。

1、氣泡排序

氣泡排序是在一堆大小不一的數中,對這些不同的值進行排序所用的一種方法,它是將相鄰的兩個數相比較,前面的一個數比後面的一個數大(小),則這兩個數交換位置,每一趟會將最小(或最大)的元素“浮”到頂端,最終達到完全有序。

程式碼實現

         public class  Test1{
            public  static void bubbleSort(int[] array){
             int tmp =
0; boolean swap = flase; //優化設定一個標誌,來判斷是否有交換 for(int i = 0;i < array.length - 1; i++){ for(int j = 0;j < array.length - i -1; j++){ if(array[j] > array[j+1]){ tmp = array[j]; array[j] = array[j + 1]; array[
j + 1] = tmp; swpa = true; } } if(!swap) { break; } } } public static void main(String[] args){ int array[] = {1,2,5,3,6,9,7}; System.out.println(
Arrays.toString(array)); } }

在這裡插入圖片描述

在氣泡排序中,若原來的陣列是有序的,也就是最好的情況下,僅需n-1次比較就可完成,時間複雜度為:O(n).
若是倒序,也就是最壞的情況下,需要(n-1)+(n-2)+…+1=n(n-1)/2,時間複雜度為O(n^2).

穩定性:穩定

效能低於選擇排序

2、直接插入排序(shell排序)

直接插入排序就是每一趟將一個待排序的記錄,按照其關鍵字的大小插入到有序佇列中的合適位置,直到全部插入。

程式碼實現

            public class Test1{
                   public static void insertSort(int[] array){  //直接插入
                   int tmp = 0;//臨時量
                   for(int i = 1;i <= array.length;i++ ){   //i從1開始
                   tmp = array[i];//將array[i]的值放在tmp
                   for(int j = i - 1;j >= i - 1;j --){  //j是i前面的值
                   if(array[j] > tmp) {
                   array[j + 1] = array[j];
               }else{
                    break;
             }
                   array[j + 1] = tmp;
         }
         }
 }
    public static void main(String[] args) {
        int[] array =  {1,2,5,3,6,9,7};
        insertSort(array);
        System.out.println(Arrays.toString(array));
    }
}

在這裡插入圖片描述

插入排序在最好情況下,需要比較n次,無需交換元素,時間複雜度為O(n),在最壞情況下,時間複雜度為O(n^2)。
但是在陣列元素隨機排列的情況下,插入排序還是優於選擇排序和氣泡排序的。
穩定性: 穩定

3、選擇排序

最簡單、最直觀的的一種演算法,基本思想為每一趟從待排序的資料元素中選擇最小(或最大)的一個元素作為首元素,直到所有的元素排完為止。
       public class Test1{
             public  static void selectedSort(int[] array) {  //選擇排序
             int tmp;
             for (int i = 0; i < array.length; i++) {
             for (int j = i + 1; j < array.length; j++)
             if (array[i] > array[i + 1]) {
                 tmp = array[i];
                 array[i] = array[j];
                 array[j] = tmp;

             }
     }
 }
               public static void main(String[] args) {
                 int[] array =  {1,2,5,3,6,9,7};
                 selectedSort(array);
                 System.out.println(Arrays.toString(array));
    }
}

在這裡插入圖片描述

時間複雜度:O(n^2 )
穩定性: 不穩定

二維陣列的拷貝

for()迴圈拷貝
     class TestArray2 {
        private int val;
        public void setVal(int val) {
        this.val = val;
    }
        public int getVal() {
        return this.val;
    }
}
     public class TestDemo10211 {
        public static void main(String[] args) {
        int[][] array = {{1, 2, 3}, {4, 5, 6}};
        int[][] brray = new int[2][3];
        for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
        brray[i][j] = array[i][j];
            }
        }
        System.out.println(Arrays.deepToString(array));
        System.out.println(Arrays.deepToString(brray));
        brray[0][0] = 1000;
        System.out.println("============修改完成=========");
        System.out.println(Arrays.deepToString(array));
        System.out.println(Arrays.deepToString(brray));
    }
}

在這裡插入圖片描述

system.arraycopy()

class TestArray2 {
    private int val;
    public void setVal(int val) {
        this.val = val;
    }
    public int getVal() {
        return this.val;
    }
}
public class TestDemo10211 {
    public static void main(String[] args) {
        TestArray2[][] testArray2 = new TestArray2[2][2];
        testArray2[0][0] = new TestArray2();
        testArray2[0][1] = new TestArray2();
        testArray2[1][0] = new TestArray2();
        testArray2[1][1] = new TestArray2();
        TestArray2[][] testArray3 = new TestArray2[2][2];
        for (int i = 0; i < testArray2.length; i++) {
            for (int j = 0; j < testArray2[i].length; j++) {
                testArray3[i][j] = testArray2[i][j];
            }
        }
        System.out.println("=============拷貝完成=========");
        for (int i = 0; i < testArray2.length; i++) {
            for (int j = 0; j < testArray2[i].length; j++) {
                System.out.print(testArray2[i][j].getVal()+" ");
            }
        }
        System.out.println();
        for (int i = 0; i < testArray3.length; i++) {
            for (int j = 0; j < testArray3[i].length; j++) {
                System.out.print(testArray3[i][j].getVal()+" ");
            }
        }
        System.out.println();

        testArray2[0][0].setVal(1000000);
        System.out.println("============修改完成=========");
        for (int i = 0; i < testArray2.length; i++) {
            for (int j = 0; j < testArray2[i].length; j++) {
                System.out.print(testArray2[i][j].getVal()+" ");
            }
        }
        System.out.println();
        for (int i = 0; i < testArray3.length; i++) {
            for (int j = 0; j < testArray3[i].length; j++) {
                System.out.print(testArray3[i][j].getVal()+" ");
            }
        }
        System.out.println();
    }
}

在這裡插入圖片描述

clone()

class TestArray2 {
    private int val;
    public void setVal(int val) {
        this.val = val;
    }
    public int getVal() {
        return this.val;
    }
}
public class TestDemo10211 {

    public static void main(String[] args) {
        TestArray2[][] testArray2 = new TestArray2[2][2];
        testArray2[0][0] = new TestArray2();
        testArray2[0][1] = new TestArray2();
        testArray2[1][0] = new TestArray2();
        testArray2[1][1] = new TestArray2();
        TestArray2[][] testArray3 = new TestArray2[2][2];
        //clone
        for (int i = 0; i <testArray2.length ; i++) {
            testArray3[i] = testArray2[i].clone();
        }
        System.out.println("=============拷貝完成=========");
        for (int i = 0; i < testArray2.length; i++) {
            for (int j = 0; j < testArray2[i].length; j++) {
                System.out.print(testArray2[i][j].getVal()+" ");
            }
        }
        System.out.println();
        for (int i = 0; i < testArray3.length; i++) {
            for (int j = 0; j < testArray3[i].length; j++) {
                System.out.print(testArray3[i][j].getVal()+" ");
            }
        }
        System.out.println();

        testArray2[0][0].setVal(1000000);
        System.out.println("============修改完成=========");
        for (int i = 0; i < testArray2.length; i++) {
            for (int j = 0; j < testArray2[i].length; j++) {
                System.out.print(testArray2[i][j].getVal()+" ");
            }
        }
        System.out.println();
        for (int i = 0; i < testArray3.length; i++) {
            for (int j = 0; j < testArray3[i].length; j++) {
                System.out.print(testArray3[i][j].getVal()+" ");
            }
        }
        System.out.println();

    }
}

在這裡插入圖片描述

Arrays.copyOf()
class TestArray2 {
    private int val;
    public void setVal(int val) {
        this.val = val;
    }
    public int getVal() {
        return this.val;
    }
}
public class TestDemo10211 {
    public static void main(String[] args) {
        TestArray2[][] testArray2 = new TestArray2[2][2];
        testArray2[0][0] = new TestArray2();
        testArray2[0][1] = new TestArray2();
        testArray2[1][0] = new TestArray2();
        testArray2[1][1] = new TestArray2();
        TestArray2[][] testArray3 = new TestArray2[2][2];
        // System.arraycopy();
        for (int i = 0; i < testArray2.length; i++) {
            testArray3[i] = Arrays.copyOf(testArray2[i], testArray2[i].length);
            System.arraycopy(testArray2[i], 0, testArray3[i], 0,
                    testArray2[i].length)