# 冒泡排序

    public static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int t = arr[i];
                    arr[i] = arr[j];
                    arr[j] = t;
                }
            }
        }
        //System.out.println(Arrays.toString(arr));
    }

# 插入排序

插入排序(Insertion sort)是一种简单直观且稳定的排序算法。

如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法。

算法适用于少量数据的排序,时间复杂度O(n^2)。

public static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int value = arr[i];

            int j = i - 1;
            for (; j > 0; j--) {
                if (arr[j] > value) {
                    arr[j + 1] = arr[j];
                    continue;
                }
                break;
            }
            arr[j] = value;
        }

        //System.out.println(Arrays.toString(arr));
    }

# 选择排序

选择排序(Selection sort)是一种简单直观的排序算法。

它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。

以此类推,直到全部待排序的数据元素的个数为零。 选择排序是不稳定的排序方法。

public static void selectionSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        int k = 0;
        int min = Integer.MAX_VALUE;
        for (int j = i; j < arr.length; j++) {
            if (arr[j] < min) {
                k = j;
                min = arr[j];
            }
        }

        arr[k] = arr[i];
        arr[i] = min;
    }

    //System.out.println(Arrays.toString(arr));
}

# 归并排序

public static void mergeSort(int[] arr) {
        System.out.println(Arrays.toString(arr));
        sub_merge(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));
    }

    private static void sub_merge(int[] arr, int l, int r) {
        if (l >= r) {
            return ;
        }

        int c = (l + r) / 2;
        sub_merge(arr, l, c);
        sub_merge(arr, c + 1, r);

        merge(arr, l, c + 1, r);
    }

    private static void merge(int[] arr, int l, int c, int r) {

        int[] leftArr = new int[c - l];
        int[] rightArr = new int[r - c + 1];

        for(int i = l ; i < c ; i ++) {
            leftArr[i - l] = arr[i];
        }

        for (int i = c ; i <= r ; i ++) {
            rightArr[i - c] = arr[i];
        }

        int i = 0;
        int j = 0;
        int k = l;
        while (i < leftArr.length && j < rightArr.length) {
            if (leftArr[i] < rightArr[j]) {
                arr[k++] = leftArr[i++];
                continue;
            }
            arr[k++] = rightArr[j++];
        }

        while (i < leftArr.length) {
            arr[k++] = leftArr[i++];
        }
        while (j < rightArr.length) {
            arr[k++] = rightArr[j++];
        }
    }

# 快速排序

    private static void subQuickSort(int[] arr, int p, int r) {
        if (p >= r) {
            return;
        }

        int pivot = partition(arr, p, r);
        subQuickSort(arr, p, pivot - 1);
        subQuickSort(arr, pivot + 1, r);
    }

    private static int partition(int[] arr, int p, int r) {
        int i = p;
        int pivot = arr[r];

        for (int j = i; j < r; j++) {
            if (arr[j] < pivot) {
                int t = arr[i];
                arr[i] = arr[j];
                arr[j] = t;
                i ++;
            }
        }

        int temp = arr[i];
        arr[i] = arr [r];
        arr[r] = temp;

        return i;
    }

# 二分查找

public int binarySearch(int[] arr, int v) {
        int l = 0;
        int r = arr.length - 1;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (arr[mid] == v)
                return mid;
            else if (arr[mid] < v)
                l = mid + 1;
            else if (arr[mid] > v)
                r = mid - 1;
        }
        return -1;
    }
最后编辑时间: 4/6/2020, 1:44:09 AM