Java動態數組及數組排序的三種常用方法


一、動態數組

1、數組的定義:

​ 用於存儲相同數據類型的一組連續的存儲空間

2、數組的特點:

​ 數組的長度一旦定義,則不可改變

​ 訪問數組的元素需要通過下標(索引)訪問,下標從0開始

​ 數組是引用數據內存,內存分布在堆內存中,數組的變量存儲的內存地址

3、動態數組:

​ 由於數組的長度定義后不能改變,所謂“動態數組”是可以增加數組的長度,所以Java實現動態數組是改變數組變量指向不同的內存地址。 本質並沒有將數組的長度改變。

​ 動態數組的本質:將內存空間的改變,以及指向數組內存的地址改變

​ 操作1:給數組添加新元素,可添加在最后面,也可添加到指定位置

/**
*添加元素(添加到末尾)
*/
public static int [] addEle(int [] array,int num){
    //目標數組	添加的原始
    //int [] array={10,9,3,2,1};
    
    //1、創建臨時數組的變量
    int [] tempArray =new int[array.length+1];
    //2、將目標數組的元素copy到臨時數組的內存中
    for(int i=0;i<array.length;i++){
        tempArray[i]=array[i];
    }
    //3、將添加的元素放入臨時數組中
    tempArray[tempArray.length-1]=num;
    //4、將目標數組的地址指向臨時數組的地址
    array=tempArray;//由於tempArray是局部變量,方法執行完內存自動回收,如果不返回 沒有地址指向tempArray的內存,如果返回並接收,說明這塊內存仍然有用。
    return array;
}

/**
     * 將元素num 添加到指定index的位置
     * @param arr
     * @param num
     * @param index
     * @return
     */
    public static int [] addEle(int [] arr , int num ,int index){
          // 1、創建臨時數組的大小
           int [] tempArray = new int[arr.length+1];
           //2、遍歷arr
           for(int i = 0 ; i<=arr.length;i++){
               //  如果i<index
               if(i<index){
                   tempArray[i] = arr[i];
               }else if(i==index){ // 2
                   tempArray[i] = num;
               }else{ // i > index
                   //  i=3   arr[i-1]   10  9  3  2  1     -> 10  9  5  3  0  0
                   // i =4   array[i-1]  2->    10  9  5 3  2 0
                   // i=5     array[4]   1  ->   10 9  5  3  2 1
                    tempArray[i] = arr[i-1];
               }
           }
           // 賦值
           arr = tempArray;
           return arr;

    }

操作2: 刪除元素 ,刪除指定下標的元素

/**
     *  刪除指定下標的元素
     * @param arr 目標數組
     * @param index  刪除的下標
     * @return 刪除之后的數組
     */
    public static int [] removeEle(int [] arr, int index){

         // 1、創建一個臨時數組 用於存放刪除后的元素
        int [] tempArray = new int [arr.length-1];
        //  2、遍歷目標數組
        for(int i = 0 ;i<arr.length;i++){
            if(i<index){
                tempArray[i] = arr[i];
            }else if(i==index){
                continue;
            }else {//i>index
                tempArray[i-1] = arr[i];
            }
        }
        // 3 將目標數組的地址變換成 新數組的地址
        arr=tempArray;
        return arr;

    }

二、數組的排序

排序:將一組數列(無序的)按照從小到大或者從大到小的順序排列。

1、冒泡排序

​ 從第一個數開始,與它相鄰的數比較,較大(或較小)的數放在后面,最終比較一輪之后,得出最大(或最小)的數放在最后

​ 比較思路:

冒泡排序的規則
*    1、從第一個數開始,將這個數 與它相鄰的數比較 ,如果 這個數大於它相鄰的數
*      則兩個數交換位置
*       i=0   相鄰i=1
*    2、依次 從第二個數開始,再將這個數與它相鄰的數比較,如果第二個數大於相鄰的數
*       則繼續交換
*       依次類推, 到倒數第二個截止 ,直到將最大的數放在最后面
*     3、重復以上1,2步驟
/
 public static void main(String[] args) {
    int [] array = {5,4,3,2,1};

        //用於交換的臨時變量
        int temp=0;

        for(int j =0;j<array.length-1;j++) {
            for (int i = 0; i < array.length -j-1; i++) {
                // 相鄰的數比較
                if (array[i] > array[i + 1]) {
                    temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp;
                }
            }
            System.out.println("比較一輪之后:" + Arrays.toString(array));
        }
}    

2、選擇排序

/**
     *  選擇排序: 從一堆數中選擇一個最小數 放在第一個位置,再從一堆數中選擇一個
     *          最小數放在第二個位置, 依次 將一堆數的最小數按順序排放。
     *    步驟: 1、假設第一個數是最小數,需要定義最小數的下標minIndex=0
     *             將這個數與后面的每一個數比較,找到最小數的下標即可
     *          2、將第一個數與最小數的下標交換 ,得出最小數在第一位。
     *          3、 依次類推, 將已比較的數 忽略,繼續從剩下的元素中找足最小數,放入已比較的數的下一位
     *              直到整個數列比較結束
     * @param args
     */
  public static void main(String[] args) {
            int [] array = {3,2,1,5,7,4};
            for(int j=0;j<array.length-1;j++) {
                // 假設第一個數是最小數
                int minIndex = j;
                // 為什么i =j+1  因為初始值要略過已比較的下標
                for (int i = 1+j; i < array.length; i++) {
                    if (array[minIndex] > array[i]) {
                        minIndex = i;
                    }
                }
                
                // 將這個最小數放在 第一位
                int temp = 0;
                temp = array[j];
                array[j] = array[minIndex];
                array[minIndex] = temp;

                System.out.println("----第一次完成后:" + Arrays.toString(array));
            }

        System.out.println("最后的排序:"+Arrays.toString(array));
    }
}

3、插入排序

/**
     * 插入排序
     *    1、從第一個元素開始,假設第一個元素是已排好序的
     *    2、從下一個元素開始,依次比較它前面的所有元素(從后向前掃描)
     *    3、 如果這個元素 小於它前面的元素 則兩兩交換 ,
     *         如果這個元素 大於它前面的元素,則不交換
     *    4、依次重復2,3步驟  ,直到將所有數 比較完成
     *   5,4,3,2,1
     *
     *   4 5 3  2  1   i從1開始
     *
     *   4 3  5 2  1    i從2開始
     *   3 4  5 2 1
     *
     *   3 4 2 5 1    i從3開始
     *   3 2 4 5 1
     *   2 3 4 5 1
     *
     *   2 3 4 1 5   i從4開始
     *   2 3 1 4 5
     *   2 1 3 4 5
     *   1 2 3 4 5
     * @param args
     */
    public static void main(String[] args) {
        int [] array = {5,4,3,2,1};
        // 外層循環循環  每一個數的比較次數
        for(int j=0;j<array.length-1;j++) {
            int temp = 0;
            for (int i = 1+j; i > 0; i--) {
                if (array[i] < array[i - 1]) {
                    temp = array[i];
                    array[i] = array[i - 1];
                    array[i - 1] = temp;
                }
            }
            System.out.println("每一次完成后的結果:"+ Arrays.toString(array));
        }
        System.out.println("最后一次完成后的結果:"+Arrays.toString(array));

    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM