选择排序/插入排序/快速排序/合并排序

239 阅读1分钟

选择排序

public static int[] selectionSort(int[] nums) {
    for (int i = 0; i < nums.length; i++) {
        int minIndex = i;
        for (int j = i; j < nums.length; j++) {
            if (nums[minIndex] > nums[j]) {
                minIndex = j;
            }
        }
        swap(nums, i, minIndex);
    }
    return nums;
}

private static void swap(int[] nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

插入排序

public static int[] insertSort(int[] nums) {
    for (int i = 0; i < nums.length; i++) {
        int c = nums[i];
        int n = i;
        for (; n > 0 && nums[n - 1] > c; n--) {
            nums[n] = nums[n - 1];
        }
        nums[n] = c;
    }
    return nums;
}

快速排序

public static List<Integer> quickSort(List<Integer> nums) {
    if (nums.size() <= 1) {
        return nums;
    }
    var x = nums.get(0);
    var left = nums.stream().filter(a -> a < x)
            .collect(toList());
    var mid = nums.stream().filter(a -> a == x)
            .collect(toList());
    var right = nums.stream().filter(a -> a > x)
            .collect(toList());
    left = quickSort(left);
    right = quickSort(right);
    left.addAll(mid);
    left.addAll(right);
    return left;
}

合并排序

private static void mergeSort(int[] a, int l, int r) {
    if (r - l <= 1) {
        return;
    }
    int mid = (l + r + 1) / 2;
    mergeSort(a, l, mid);
    mergeSort(a, mid, r);

    merge(a, l, mid, r);
}

private static void merge(int[] a, int l, int mid, int r) {
    int[] b = Arrays.copyOfRange(a, l, mid + 1);
    int[] c = Arrays.copyOfRange(a, mid, r + 1);
    b[b.length - 1] = c[c.length - 1] = Integer.MAX_VALUE;
    int i = 0, j = 0;
    for (int k = l; k < r; k++) {
        if (b[i] < c[j]) {
            a[k] = b[i++];
        } else {
            a[k] = c[j++];
        }
    }
}