排序算法

常考排序

快速排序

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)
        {
            (nums[i], nums[j]) = (nums[j], nums[i]);
            i++;
        }
    }
    // 把基准值换到中间
    (nums[i], nums[end]) = (nums[end], nums[i]);
    return i;
}

归并排序

堆排序

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

完美二叉树 VS 其他二叉树

image.png

动画展示

image.png

核心代码

参考

十大经典排序

二叉堆

练习

最后更新于