排序

2021-08-01  本文已影响0人  意大利大炮
相关排序方式
算法 最坏时间 最好时间 最坏交换次数 是否原址
选择排序 O(n^2) O(n^2) O(n)
插入排序 O(n^2) O(n) O(n^2)
归并排序 O(nlogn) O(nlogn) O(nlogn)
快速排序 O(n^2) O(nlogn) O(n2)
选择排序
    public void sort(int A[]) {
        for (int i = 0; i < A.length; i ++) {
            int min = i;
            for (int j = i + 1; j < A.length; j ++) {
                if (A[j] < min) {
                    min = j;
                }
            }
            // 最小值放到索引 i 的位置
            int temp = A[min];
            A[i] = A[min];
            A[min] = temp;
        }
    }
插入排序
    public void sort(int A[]) {
        for (int i = 1; i < A.length; i ++) {
            for (int j = i; j > 0 && A[j] < A[j - 1]; j --) {
                // 交换下标j与下标j-1的值
                int temp = A[j];
                A[j] = A[j - 1];
                A[j - 1] = temp;
            }
        }
    }
归并排序
/**
     * 归并排序
     * @param A 数组
     * @param p 要操作的起始位置
     * @param r 要操作的终点位置
     */
    public void mergeSort(int A[], int p, int r) {
        if (p >= r) {
            return;
        }
        // 分解为两个子问题
        int q = (p + r) / 2;
        mergeSort(A, p, q);
        mergeSort(A, q + 1, r);
        // 归并
        merge(A, p, q, r);
    }

    public void merge(int A[], int p, int q, int r) {
        int n1 = q - p + 1; // 数组左部长度
        int n2 = r - q; // 数组左部长度
        // 将数组copy到新数组中
        int B[] = new int[n1 + 1];
        int C[] = new int[n2 + 1];
        System.arraycopy(A, p, B, 0, n1);
        System.arraycopy(A, q + 1, C, 0, n2);
        // 新数组的最后一位设置为最大值, 防止数组越界。这里应该设置为正无穷大,但需要用double。
        // 这里先用int的最大值。所以数组不可以存在大于int最大值的元素
        B[n1] = Integer.MAX_VALUE;
        C[n2] = Integer.MAX_VALUE;

        // 归并两个新数组
        int i = 0, j = 0;
        for (int k = p; k <= r; k ++) {
            if (B[i] <= C[j]) {
                A[k] = B[i];
                i ++;
            } else {
                A[k] = C[j];
                j ++;
            }
        }
    }
快速排序
 /**
     * 快速排序
     * @param A 数组
     * @param p 要操作的起始位置
     * @param r 要操作的终点位置
     */
    public void quickSort(int A[], int p, int r) {
        if (p >= r) {
            return;
        }

        // 将数组分解为左右两部分(两部分都是无序的,但右边的都比左边的大),
        // 并获取中间索引
        int q = partTition(A, p, r);

        // 将左右两部分递归排序
        quickSort(A, p, q - 1);
        quickSort(A, q + 1, r);
    }

    public int partTition(int A[], int p, int r) {
        int q = p;

        // 这里将r设置为主元(在数组
        for (int u = p; u < r; u ++) {
            if (A[u] < A[r]) {
                int temp = A[q];
                A[q] = A[u];
                A[u] = temp;
                q ++;
            }
        }
        int temp = A[q];
        A[q] = A[r];
        A[r] = temp;
        return q;
    }
上一篇下一篇

猜你喜欢

热点阅读