归并排序 Java的实现与思路

tech2022-10-29  134

归并排序的思路来自于分治思想,不断的对目标数组进行分割使分割后的数组最终进入到有序状态,在从下到上对已经有序的数组进行合并,并排序使合并后的数组依旧有序。直到最后合并为一个完整的数组。

在这种思路下很自然的就会想到递归,因为我们的分解操作要保证在合并操作之前,而切要确定在下级数组有序时执行合并并排序的操作使当前数组有序在被上级数组察觉重复此操作,而这两种操作又都是要循环多次,但是他们之间又有一个判断存在,这样递归这种中断当前栈桢去开辟新的一摸一样的栈桢的操作就很符合我们的需要。

思路: 1.首先我们要根据当前数组去找到一个中间位置来将元素数组分割成两个数组。 2.在1操作后就进入了每一层都有两个数组的情况,这时就是分别对左子数组和右子数组递归排序函数。 3.在循环多次2操作之后满足left==right时这时我们找不出中间点了,就return中断递归。 4.3操作后会依次回到各个上级数组,这时调用合并排序算法将统一层的两个数组合并并排序。 5.最后回到1操作这一层仅有一个数组并结束递归。

上面1到5就是我们的思路代码如下:

//排序,分治中的分,分并排序 private static int[] margeSort(int[] A,int low,int hight){ int mid = (low+hight)/2; if(low<hight){ //fen margeSort(A, low, mid); margeSort(A, mid+1, hight); //zhi marge(A,low,hight,mid); // marge(A,null,hight,low,mid); } return A; } //分治中的治 private static void marge(int[] A,int low,int hight,int mid){ int[] result = new int[hight-low+1]; int i = low; int j = mid+1; int k = 0; while (i<=mid&&j<=hight){ if(A[i]<A[j]){ result[k++] = A[i++]; }else { result[k++] = A[j++]; } } while (i<=mid){ result[k++] = A[i++]; } while (j<=hight){ result[k++] = A[j++]; } for (int x=0;x<result.length;x++){ A[low+x] = result[x]; } }
最新回复(0)