这里讲的是我对归并排序的一点理解和如何去实现。
归并排序算法算是排序中比较难的一个了,主要是其涉及到利用分治的思想去解决问题。
其主要是将一个大问题分成小问题。然后每个小问题去进行处理和解决。假如有一个数组需要去排序,数组中的数据如下:int arr[] = {8 , 4 , 3 , 7 , 2 , 6 , 1,5};
我们要去对其进行排序——>大问题
那么将大问题分成子问题:切半——>{8,4,3,7} 以及{2,6,1,5}那么子问题也不好解决,继续分解:
**每个子问题切成两半:{8,4}、{3,7}以及{2,6}、{1,5}**这样是不是容易多了,每个子问题都化为了很简单的数值比较。那么用图去画出来就是如下图:
那么可以得到一个结论是:此算法分为两步——分以及合
分的时候:使用递归算法进行拆分。而重点是在合的时候,如何合并以及在合并的时候位置的转换尤为重要。我来讲讲合的时候的思路:
当我们递归拆分的时候,要记住一点,我们不是分开调用函数去拆分,而是递归,递归会有自己的方法栈,存储整一个过程,那么拆分到最后子问题2的时候,没得再拆分了,就直接进行合操作。然后操作完成后再到上一个调用了递归的函数的方法栈中进行第二步合并。
那么我们就可以从小块问题上慢慢合并,但是合并的同时要进行顺序操作。而且我们要使用一个新的数组去进行更好的排序。其中有三个步骤:
①将小块上的两半分别存入新的数组中进行排序,直到有一半的值复制进新数组中排序完成
②将另一半剩余的值依次按照顺序去复制进新的数组
③将新的数组的值全部复制到旧数组中
代码如下:
//分方法
/*
arr[]为传入的原数组
left为需要排序的数组的最左边的索引
right为需要排序的数组的最右边的索引
temp[]为新建的数组
*/
public static void mergeSort(int arr[] , int left , int right , int temp[])