java之陣列的索引,排序以及二維陣列

HKDXiaoFan發表於2017-12-01

陣列的索引
1,通過索引查詢陣列的元素
即通過元素的下標來查詢該元素

int[] array = new int[] {1,2,3,4,5};
    int num = array[2];
    System.out.println(num);

輸出為:3.
要注意的是,陣列中元素的下標是從0開始計數的
2.通過元素查詢索引,即查詢元素在陣列中的下標

    int num = 5;//查詢該元素在陣列中的位置
    int index = -1;//定義一個變數用來記錄元素的下標
    int[] array = new int[] {1,2,3,4,5,6};
    for (int i = 0; i < array.length; i++) 
    {
        if (array[i]==num) 
        {
            index = i;//當陣列中的元素與要查詢的元素的值一樣時,則查到了
            break;//跳出迴圈
        }
    }
    System.out.println("在陣列中的位置為"+index);//如果輸出為-1,則說明該元素不在陣列中

輸出為

在陣列中的位置為4

陣列元素的反轉:即陣列中的元素對稱交換位置
例:封裝一個函式,用來對陣列反轉

public static int[] change(int[]array)
{
    int num = array.length/2;   //確定要交換的次數,即迴圈的次數
    for (int i = 0; i < num; i++) 
    {
        int temp = array[i];        //需要定義一個變數作為中間值
        array[i] = array[array.length-1-i];
        array[array.length-1-i] = temp;
    }
    return array;
}

再寫一個函式,有來交換兩個數的值

public static void changeNumber(int a,int b)
{
    int temp = a;
    a = b ;
    b = temp;
}
public static void main(String[] args) {
    int a = 10; 
    int b = 100;
    changeNumber(10, 100);
    System.out.println("a的值為"+a +",b的值為"+b);
    }

則輸出結果是a = 10,b =100,
那麼為什麼兩個數的值並沒有交換,而陣列中的元素卻交換了?
這裡寫圖片描述
因為,所有的函式都是存在於棧記憶體中的,而陣列是存在堆記憶體中,在陣列的元素交換中,陣列傳入函式中的是,陣列的地址,函式內部是通過地址找到堆記憶體中的陣列,並對陣列進行操作的,
但是僅僅是交換兩個數的值時,兩個數值都是存在於main函式中,也是存在棧記憶體中,傳入changNumber函式的倆值其實就是倆常數,並未將main函式中的a,b傳進去.
⚠️棧記憶體的特點是當函式執行完畢時,系統會立即釋放記憶體,但是堆記憶體中的垃圾回收機制(GC)有滯後性.
陣列的排序
陣列的排序的方法有很多:氣泡排序,選擇排序,插入排序等.另外系統中也給我提供了排序的方法
1.系統提供的排序方法

int[]array = new int[] {2,3,8,1,5,6};
    Arrays.sort(array);
    System.out.println(Arrays.toString(array));

輸出為:[1, 2, 3, 5, 6, 8]
可以看出系統提供的是升序排列的方法
2.氣泡排序
氣泡排序的流程是:比較相鄰倆元素的大小,然後根據需要交換位置

int[]array = new int[] {2,3,8,1,5,6};
//氣泡排序的外層控制的是需要確定元素的次數
    for (int i = 0; i < array.length-1; i++) {
    //內層迴圈控制的是每個數需要比較的次數,-i是因為有i個元素已經確定了位置,不需要比較了
        for (int j = 0; j < array.length-1-i; j++)
        {
            if (array[j]>array[j+1]) 
            {
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp; 
            }
        }
            System.out.println(Arrays.toString(array));

輸出結果為:

[1, 2, 3, 5, 6, 8]

3.選擇排序
選擇排序的原理:選擇一個數和陣列中的其它數都進行一次比較,然後根據大小進行交換位置,一般第一個數會選擇下標為0的數

    for (int i = 0; i < array.length-1; i++) 
    {
    //i+1是因為每次重新開始迴圈就說明確定了一個值,則比較的次數就少1
        for (int j = i+1; j < array.length; j++) 
        {
            if (array[i]>array[j]) 
            {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
    System.out.println(Arrays.toString(array));

輸出結果為

[1, 2, 3, 5, 6, 8]

折半查詢
折半查詢的前提是陣列要是一個有序的陣列
折半查詢的原理是先把要查詢的值和陣列的中間值進行比較,如果小於中間值,則再和左半邊陣列的中間值進行比較,一直到找出值為止,或者倒最後也沒有找到(也可以理解為最小下標和最大下標的移動)
例:求出15在下列陣列中的位置

int[] array = new int[] {3,6,8,11,13,19,25};
int num = 15;
    int min = 0;
    int max = array.length - 1;
    int mid = (min + max)/2;
    while (array[mid]==num)
    {
        if (array[mid]>num)
        {
            max = mid-1;
        }else if (array[mid]<num) 
        {
            min = mid +1;
        }
        mid = (min + max)/2;
        if (min>max) 
        {
            mid = -1;
        }
    }
    System.out.println("該元素在陣列中的位置為:"+mid);

輸出結果是:該元素在陣列中的位置為:-1,則說明15不在陣列中.
二維陣列
二維陣列的定義:將一組資料型別相同的一維陣列放在一起,二維陣列也是一個容器
宣告二維陣列的方法:

 int[][] arr = new int[5][6];//二維陣列中有5個一維陣列,每個一維陣列中又裝了6個元素,切元素都是int型別的

二維陣列的宣告只需要把二維陣列的長度宣告瞭即可,也可以不宣告一維陣列的長度

 int[][] arr = new int[5][];
//直接在後面寫出陣列中的元素也是可以的
int[][] arr = new int[][] {
        {1,2,5,4,9},
        {6,7,3,6,8},
        {2,4,1,5,3}
    };

二維陣列的遍歷
即:將陣列中的元素全部訪問一遍

int[][] arr = new int[][] {
        {1,2,5,4,9},
        {6,7,3,6,8},
        {2,4,1,5,3}
    };
    for (int i = 0; i < arr.length; i++) {
        for (int j = 0; j < arr[i].length; j++) //將二維陣列中的一維陣列全部遍歷一遍
        {
            if (i==arr.length-1 &&j == arr[arr.length-1].length-1) 
            {
            System.out.println(arr[i][j]);  
            }
            else
            {
        System.out.print(arr[i][j]+",");
        }
        }

    }

輸出結果為

1,2,5,4,9,6,7,3,6,8,2,4,1,5,3

相關文章