排序算法

常考排序

快速排序

public void quickSort(int[] nums) {
    // 思路:把一个数组分为左右两段,左段小于右段
    quickSort(nums, 0, nums.length - 1);
}

// 原地交换,所以传入交换索引
private void quickSort(int[] nums, int start, int end) {
    if (start < end) {
        // 分治法:divide
        int pivot = partition(nums, start, end);
        quickSort(nums, 0, pivot - 1);
        quickSort(nums, pivot + 1, end);
    }
}

// 分区
private int partition(int[] nums, int start, int end) {
    // 选取最后一个元素作为基准pivot
    int p = nums[end];
    int i = start;
    // 最后一个值就是基准所以不用比较
    for (int j = start; j < end; j++) {
        if (nums[j] < p) {
            swap(nums, i, j);
            i++;
        }
    }
    // 把基准值换到中间
    swap(nums, i, end);
    return i;
}

// 交换两个元素
private void swap(int[] nums, int i, int j) {
    int temp = nums[i];
    nums[i] = nums[j];
    nums[j] = temp;
}

归并排序

堆排序

用数组表示的完全二叉树 complete binary tree

完全二叉树 VS 其他二叉树

image.png

动画展示

image.png

核心代码

参考

十大经典排序

二叉堆

最后更新于