注册

算法基础:归并排序


上一篇文章介绍了什么是分治思想,今天就来看一下它其中一个继承人-- 归并排序,本章主要介绍归并排序的原理,以及对一个实际问题进行编码。


学习的内容




1. 什么是归并排序


比如我们拿到一个数组,如果想使用归并排序,应该怎么做呢?首先我们将数组从中间切分,分成左右两个部分,然后对左半部分和右半部分进行排序,两边部分又可以继续拆分,直至子数组中只剩下一个数据位置。


然后就要将拆分的子数组进行合并,合并的时候会涉及到两个数据进行比较,然后按照大小进行排序,以此往上进行合并。


拆分过程


image.png
合并过程


image.png


从上面我们可以看出,我们最终将大的数组拆分成只有单个数据的数组,然后进行合并,在合并过程中比较两个长度为1的数组,进行排序合并成新的子数组,然后依次类推,直至全部排序完成,也就意味着原数组排序完成。


2.代码示例


public class Solution {
   public static void main(String[] args) {
       int[] arr = {1,4,3,2,11};
       sortArray(arr);
       System.out.println(arr);
  }

   public static int[] sortArray(int[] nums) {
       quickSort(nums, 0, nums.length - 1);
       return nums;
  }

   private static void quickSort(int[] nums, int left, int right) {
       if (left >= right) {
           return;
      }
       int partitionIndex = getPartitionIndex(nums, left, right);
       quickSort(nums, left, partitionIndex - 1);
       quickSort(nums, partitionIndex + 1, right);
  }

   private static int getPartitionIndex(int[] nums, int left, int right) {
       int pivot = left;
       int index = pivot + 1;
       for (int i = index; i <= right; i++) {
           if (nums[i] < nums[pivot]) {
               swap(nums, i, index);
               index++;
          }
      }
       swap(nums, pivot, index - 1);
       return index - 1;
  }

   private static void swap(int[] nums, int i, int j) {
       int temp = nums[i];
       nums[i] = nums[j];
       nums[j] = temp;
  }
}




总结


本章简单分析了归并排序的原理以及分享了一个实际案例,无论是归并还是归并算法,对理解递归还是很有帮助的,之前总是靠着想递归流程,复杂点的绕着绕着就晕了,后面会再看一下快速排序,他和本文提到的归并排序都是分治思想,等说完快排,再

作者:花哥编程
来源:juejin.cn/post/7250404077712048165
一起对比两者的区别。

0 个评论

要回复文章请先登录注册