title: 排序算法之归并排序
date: 2019-09-09 16:50:54
tags: -归并排序
算法思想
-
首先,将两个有序数组进行合并排序是很容易的,及比较两个数组的第一个元素。小的从数组中取出,并放到一个临时数组中,重复上述操作,直到一个数组中的元素已经被取完。然后直接将剩余数组的元素直接放到临时数组后。
-
代码如下
private static void Merge_array(int[] a,int n,int[] b,int m,int[] temp) { int i,j,k=0; while(i<=n && j<=m) { if(array[i]<array[j]) { temp[k++] = array[i++]; } else { temp[k++] = array[j++]; } } while(i<=n) { temp[k++] = array[i++]; } while(j<=m) { temp[k++] = array[j++]; } }
-
在上述思想的基础上,就产生了归并排序。但是上述代码的前提是要求两个待排序的数组有序。
若现在有一个待排序的数组,我们将其进行分割,若最后分割成每一块只有一个元素,就可以看成一个有序的数组(一个数组就只有其一个元素,肯定是有序的)。对这些只有一个元素的数组进行两两排序(此时就保证了是两个有序数组进行合并排序)。
-
在分割待排序数组的时候用到了递归的方法。
以本题举例分割时主要递归执行Merge_sort()函数。执行过程如下:
first和last的取值依次是(0,9)(0,4)(0,2)(0,1)(0,0),由于这个过程中直到(0,0)才使first<last不成立。于是退到(0,1),该执行Merge_sort(array,mid+1,last,temp),此时mid+1=1 ,last=1,不满足first<last,于是执行
Merge_adjoin_array(array,temp,first,mid,last),这次排序排的是array[0]和array[1],执行完退到(0,2),执行Merge_sort(array,mid+1,last,temp),mid+1=2,last=2,不满足first<last,然后执行Merge_adjoin_array(array,temp,first,mid,last),将a[0-1]数组和a[2]进行排序,因为a[0-1]已经是有序的了,此时得到有序数组a[0-2]。然后退回到(0,4),执行Merge_sort(array,mid+1,last,temp),此时mid+1=3,last=4,满足first<last,得到mid=(first+last)/2=3,执行Merge_sort(array,first,mid,temp),first=3 mid=3,不满足first<last,则回退执行Merge_sort(array,mid+1,last,temp),mid+1=4,last=4,也不满足first<last,则回退执行Merge_adjoin_array(array,temp,first,mid,last),使a[3]和a[4]两个有序数组合并排序成a[3-4],在执行(0,4)中的Merge_adjoin_array(array,temp,first,mid,last),使a[0-2]和a[3-4]两个有序数组进行合并有序排列。以后类推。
package merge; import Select.NewArray; public class Merge_sort { public static void main(String[] args) { NewArray array = new NewArray();//这样就随机生成了一个有十个成员的数组 int[] a = array.Array(); System.out.println("初始状态"); Display(a); int[] temp = new int[10]; Merge_sort(a,0,9,temp); Display(a); } private static void Merge_adjoin_array(int[] array,int[] temp,int first,int mid,int last) { int i = first,j = mid+1; int m = mid,n = last,k =0 ; while(i<=m && j<=n) { if(array[i]<array[j]) { temp[k++] = array[i++]; } else { temp[k++] = array[j++]; } } while(i<=m) { temp[k++] = array[i++]; } while(j<=n) { temp[k++] = array[j++]; } for(i=0;i<k;i++) { array[first+i] = temp[i]; } } private static void Merge_sort(int[] array,int first,int last,int[] temp) { if(first<last) { int mid = (first+last)/2; Merge_sort(array,first,mid,temp); Merge_sort(array,mid+1,last,temp); Merge_adjoin_array(array,temp,first,mid,last); } } private static void Display(int[] array) { for(int i = 0;i<array.length;i++) { System.out.print(array[i]); System.out.print(" "); } System.out.println(); } }