开发喵星球

关卡5:归并排序(Merge Sort)

pPeHp90.png pPeHkB4.png

本文内容是对归并排序的梳理和总结,本文内容包括:

排序算法十大经典方法

  1. 冒泡排序:比较相邻元素并交换,每一轮将最大的元素移动到最后。
  2. 选择排序:每一轮选出未排序部分中最小的元素,并将其放在已排序部分的末尾。
  3. 插入排序:将未排序部分的第一个元素插入到已排序部分的合适位置
  4. 希尔排序:改进的插入排序,将数据分组排序,最终合并排序
  5. 归并排序:将序列拆分成子序列,分别排序后合并,递归完成
  6. 快速排序:选定一个基准值,将小于基准值的元素放在左边,大于基准值的元素放在右边,递归排序
  7. 堆排序:将序列构建成一个堆,然后一次将堆顶元素取出并调整堆
  8. 计数排序:统计每个元素出现的次数,再按照元素大小输出
  9. 桶排序:将数据分到一个或多个桶中,对每个桶进行排序,最后输出
  10. 基数排序:按照元素的位数从低到高进行排序,每次排序只考虑一位

归并排序(Merge Sort)

算法步骤

  1. 把长度为n的序列分成两个长度为n/2的子序列
  2. 对这两个子序列分别采用归并排序
  3. 将两个排序好的子序列合并成一个最终的排序序列

举例说明

图解算法

如果下图不动,点击这里查看在线的图解

代码实现

public static void main(String[] args) {
    int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
    sort(arr);
    System.out.println(Arrays.toString(arr));
}

public static void sort(int[] arr) {
    //在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间
    int[] temp = new int[arr.length];
    sort(arr, 0, arr.length - 1, temp);
}

private static void sort(int[] arr, int left, int right, int[] temp) {
    if (left < right) {
        int mid = (left + right) >> 1;

        //左边归并排序,使得左子序列有序
        sort(arr, left, mid, temp);

        //右边归并排序,使得右子序列有序
        sort(arr, mid + 1, right, temp);

        //将两个有序子数组合并操作
        merge(arr, left, mid, right, temp);
    }
}

private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
    int i = left;//左序列指针
    int j = mid + 1;//右序列指针
    int t = 0;//临时数组指针
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[t++] = arr[i++];
        } else {
            temp[t++] = arr[j++];
        }
    }
    while (i <= mid) {//将左边剩余元素填充进temp中
        temp[t++] = arr[i++];
    }
    while (j <= right) {//将右序列剩余元素填充进temp中
        temp[t++] = arr[j++];
    }
    t = 0;
    //将temp中的元素全部拷贝到原数组中
    while (left <= right) {
        arr[left++] = temp[t++];
    }
}

算法分析

   
分类:数据结构和算法 作者:开发喵 发表于:2023-08-17 16:09:29 阅读量:114
  >>


powered by kaifamiao