数据结构第二季 Day03 归并排序

1、归并排序的英文名称是什么?归并排序的思想流程是什么?(重要)

  • 归并排序:Merge Sort
  • 执行流程:
  • ① 不断地将当前序列平均分割成 2 个子序列;直到不能再分割(序列中只剩 1 个元素)
  • ② 不断地将 2 个子序列合并成一个有序序列;直到最终只剩下 1 个有序序列
image.png

2、归并 merge 过程(感悟到思想即可)?

image.png

3、merge 在算法中的细节,不去创建新的总数组,而只创建左边数组的拷贝。

image.png

4、在左右两边的数组合并过程中,左边数组先结束会如何?右边先结束会如何?(分类思考的思维方式很重要)

  • 左边数组先越界:那么可以直接终止排序,因为右边数组本就有序的在大数组中
  • 右边数组先越界:需要继续遍历,将左边的数组数据拷贝到到大数组的尾部

5、归并排序的代码实现

public class MergeSort> extends Sort {
    private T[] leftArray;

    @Override
    protected void sort() {
        leftArray = (T[]) new Comparable[array.length >> 1];
        sort(0, array.length);
    }

    private void sort(int begin, int end) {
        if (end - begin < 2) return;

        int mid = (end + begin) >> 1;
        sort(begin, mid);
        sort(mid, end);
        merge(begin, mid, end);
    }
    private void merge(int begin, int mid, int end) {
        int li = 0, le = mid - begin;
        int ri = mid, re = end;
        int ai = begin;

        //拷贝数组
        for (int i = li; i < le; i++) {
            leftArray[i] = array[i + begin];
        }

        //进行 merge (如果左边还没结束)
        while (li < le) {
            if (ri < re && cmp(leftArray[li], array[ri]) > 0) { //右边小,取右边
                array[ai++] = array[ri++];
            } else { //左边小,取左边 (右边排完,也要取左边)
                array[ai++] = leftArray[li++];
            }
        }
    }
}

6、归并排序和其他算法的对比

2w 个完全无序的数据排序

7、递归调用的世界复杂度其实很难计算(对比 for、while 循环),那么如何计算归并排序复杂度呢?(先记着,后面再理解吧)

image.png
image.png

8、史上最强排序 - 休眠排序(这只是个段子)哈哈哈哈哈哈

image.png

你可能感兴趣的:(数据结构第二季 Day03 归并排序)