1. 程式人生 > 實用技巧 >【Java基礎】陣列和演算法

【Java基礎】陣列和演算法

陣列和演算法

查詢演算法

線性查詢

...

二分查詢

二分查詢要求資料結構是有序的。

package com.parzulpan.java.ch03;

/**
 * @Author : parzulpan
 * @Time : 2020-11-17
 * @Desc : 二分查詢
 */

public class BinaryFind {

    public static boolean binaryFind(int[] arr, int number) {
        boolean isFlag = false;
        int start = 0, end = arr.length - 1;

        while (start <= end) {
            int mid = (start + end) / 2;
            if (arr[mid] == number) {
                isFlag = true;
                break;
            } else if (arr[mid] > number) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }

        return isFlag;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
        System.out.println(binaryFind(arr, 256));
        System.out.println(binaryFind(arr, 1342));
    }
}

排序演算法

排序:假設含有 n 個記錄的序列為 {R1,R2,...,Rn},其相應的關鍵字序列為 {K1,K2,...,Kn}。將這些記錄重新排序為 {Ri1,Ri2,...,Rin},使得相應的關鍵字值滿足條 Ki1<=Ki2<=...<=Kin,這樣的一種操作稱為排序。

通常來說,排序的目的是快速查詢。

衡量排序演算法的優劣:

  • 時間複雜度:分析關鍵字的比較次數和記錄的移動次數;
  • 空間複雜度:分析排序演算法中需要多少輔助記憶體;
  • 穩定性:若兩個記錄 A 和 B 的關鍵字值相等,但排序後 A、B 的先後次序保持不變,則稱這種排序演算法是穩定的。

排序演算法分類:

  • 內部排序:整個排序過程不需要藉助於外部儲存器(如磁碟等),所有排序操作都在記憶體中完成;
  • 外部排序:參與排序的資料非常多,資料量非常大,計算機無法把整個排序過程放在記憶體中完成,必須藉助於外部儲存器(如磁碟)。外部排序最常見的是多路歸併排序。可以認為外部排序是由多次內部排序組成。

內部排序演算法:

  • 選擇排序:直接選擇排序、堆排序;
  • 交換排序:氣泡排序、快速排序;
  • 插入排序:直接插入排序、折半插入排序、希爾排序;
  • 歸併排序;
  • 桶排序;
  • 基數排序。

其中,快速排序、直接選擇排序、希爾排序和堆排序是不穩定排序。

!待更新

排序演算法效能對比:

排序方法 平均時間複雜度 平均時間複雜度 平均時間複雜度 空間複雜度 穩定性
直接選擇排序 O(n^2) O(n^2) O(n^2)
O(1) 不穩定
堆排序 O(nlog2n) O(nlog2n) O(nlog2n) O(1) 不穩定
氣泡排序 O(n^2) O(n^2) O(n) O(1) 穩定
快速排序 O(nlog2n) O(n^2) O(nlog2n) O(nlog2n) 不穩定
直接插入排序 O(n^2) O(n^2) O(n) O(1) 穩定
直接選擇排序 O(n^2) O(n^2) O(n^2) O(1) 不穩定
直接選擇排序 O(n^2) O(n^2) O(n^2) O(1) 不穩定
直接選擇排序 O(n^2) O(n^2) O(n^2) O(1) 不穩定
直接選擇排序 O(n^2) O(n^2) O(n^2) O(1) 不穩定
直接選擇排序 O(n^2) O(n^2) O(n^2) O(1) 不穩定

排序演算法效能比較:

排序演算法的選擇:

Arrays 工具類

java.util.Arrays 類即為運算元組的工具類,包含了用來運算元組(比如排序和搜尋)的各種方法。

常見方法:

方法 說明
boolean equals(int[] a,int[] b) 判斷兩個陣列是否相等。
String toString(int[] a) 輸出陣列資訊。
void fill(int[] a,int val) 將指定值填充到陣列之中。
void sort(int[] a) 對陣列進行排序。
int binarySearch(int[] a,int key) 對排序後的陣列進行二分法檢索指定的值。
package com.parzulpan.java.ch03;

import java.util.Arrays;

/**
 * @Author : parzulpan
 * @Time : 2020-11-17
 * @Desc : Arrays 工具類的常用方法
 */

public class ArraysTest {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1, 2, 3, 4};
        int[] arr2 = new int[]{1, 3, 2, 4};

        System.out.println(Arrays.equals(arr1, arr2));

        System.out.println(Arrays.toString(arr1));

        int[] arr3 = new int[]{1, 2, 3, 4};
        Arrays.fill(arr3, 10);
        System.out.println(Arrays.toString(arr3));

        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));

        int[] arr4 = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
        int index = Arrays.binarySearch(arr4, 239);
        if (index < 0) {
            System.out.println("arr4 中不存在 " + 239);
        }
    }
}

練習和總結

!待更新