排序算法第三谈:归并排序

小灰灰 2023-01-02 01:17 222阅读 0赞

归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。

思想:

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

  1. 分解:将n个元素分成个含n/2个元素的子序列。
  2. 解决:用合并排序法对两个子序列递归的排序。
  3. 合并:合并两个已排序的子序列已得到排序结果。

image.png

  1. /** * @param arr 原数组 * @param left 左端索引 * @param right 右端索引 * @param temp 拷贝数组 */
  2. public static void mergeSort(int[] arr, int left, int right, int[] temp) {
  3. if (left < right) {
  4. //分
  5. int point = (left + right) / 2;
  6. mergeSort(arr, left, point, temp);
  7. mergeSort(arr, point + 1, right, temp);
  8. //合并
  9. merge(arr, left, point, right, temp);
  10. }
  11. }
  12. /** * 合并 * * @param arr 原数组 * @param left 左端索引 * @param mid 中间索引 * @param right 右边索引 * @param temp 拷贝数组 */
  13. public static void merge(int[] arr, int left, int mid, int right, int[] temp) {
  14. //从左往右依次合并
  15. int l = left;
  16. int r = mid + 1;
  17. int t = 0;//temp数组的索引
  18. while (l <= mid && r <= right) { //只有两端数据都没有合并,才逐个进行合并
  19. if (arr[l] <= arr[r]) temp[t++] = arr[l++];
  20. else temp[t++] = arr[r++];
  21. }
  22. //如果左端没有遍历完成
  23. while (l <= mid) {
  24. temp[t++] = arr[l++];
  25. }
  26. //如果右边没有遍历完成
  27. while (r <= right) {
  28. temp[t++] = arr[r++];
  29. }
  30. //拷贝回原数组,不是拷贝所有位置,只有复制的这一段需要拷贝
  31. int tempLeft = left;//当前合并的元素最左边的位置
  32. t = 0;
  33. while (tempLeft <= right) {
  34. arr[tempLeft++] = temp[t++];
  35. }
  36. }

发表评论

表情:
评论列表 (有 0 条评论,222人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法归并排序

    > 归并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单

    相关 排序算法——归并排序

    引言 归并排序可以使用递归或迭代的方式来实现,时间复杂度是都是 O(N \ logN)。 归并排序的核心是将待排序数组分组,可以整体二分,也可以设置步长迭代切分。归并排

    相关 排序算法-归并排序

    归并排序也是一个比较快速的排序算法,其思想是运用分治的思想,先对要排序的数进行分,每次从中间分成两部分,然后知道分成最小,然后在把他们合起来,边合起来边排序,最后有序,每次分的

    相关 排序算法归并排序

    一、前言     归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用 分治法(Divide and Conquer) 的一个非常典型的应用。 --------