2022更文挑战18-归并排序

111 阅读2分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

归并排序

前文

本文是个人对于归并排序相关知识的理解及总结,内容难免会有错误或不准确之处,还请见谅。

归并排序

归并排序故名思义,可以想到是将两个或多个队列合并成一个新的队列。整体来说,归并排序就是将两个或多个,正常来说是两个已经排好的队列,将其合并为一个新的队列,作为后续的排序结果。而在实际的操作过程中,一般采用一个新的队列,用来存储排序后的数据。在合并的过程中会对现有的两个队列进行遍历操作,根据指针的移动,比较两个的数值,根据需求将其放入新的队列当中。

而在操作过程中,主要是采用如下的流程:

  • 申请空间:先申请一个目标空间,目标空间的大小等于现有两个队列空间之和,用于存储排序后的数据。
  • 循环遍历:采用两个指针同时对现有队列进行遍历操作。
  • 数据比较:移动两个队列的循环指针,比较两个队列指针处元素的大小。假设为从小到大的排序,将较小的元素放入新的队列中,同时移动该指针。再比较两个指针处元素的大小,重复上述的存储及指针移动操作。按上述方式反复循环,直至两个队列遍历完毕,得到的新队列即位排序好的数据。

简单看一下归并排序的伪代码:

public void startSort(int[] arr){
    int[] temp = new int[arr.length];
    sort(arr,0,arr.length-1,temp);
}

public void sort(int[] arr,int left,int right,int []temp){
    sort...
    sort...
    mergeSort...
}

主要思路就是反复对于给定的队列进行归并排序,向上递归,最终就可以得到排序好的队列。

归并排序的时间复杂度为nlog2n,而空间复杂度由于在执行过程中需要额外的空间,因此空间复杂度为o(n)。时间复杂度在任何时间均不变,因此这是一种很优秀的排序算法。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。