将两个或者两个以上的有序表组合成一个新的有序表
无论是顺序存储还是链式存储,都能在O(m+n)的时间量级上完成
稳定O(nlogn)
分治策略 递归
2-路归并排序:将一维数组中前后相邻的两个有序序列归并为一个有序序列
public static void mergeSort(int[] array){ int temp[] = new int[array.length]; //和待排序序列等长的数组,用于在排序过程中临时存储 subMergeSort(array, 0, array.length-1, temp); } public static void subMergeSort(int[] array,int left,int right,int[] temp){ //将待排序序列分成一个一个的子序列,直到子序列的长度为1,然后一步一步将子序列合并成一个一个有序的子序列,直到整体有序 int mid = (left+right)/2; System.out.print("sub------"+left+"-"+mid+"-"+right+"---");listArray(array,left,right); if(left<right){ subMergeSort(array, left, mid, temp); subMergeSort(array, mid+1, right, temp); mergeSub(array, left, mid, right, temp); } } public static void mergeSub(int[] array,int left,int mid,int right,int[] temp){ int i = left;//前面那个子序列的第一个元素的下标,前面子序列最后一个元素的下标为mid int j = mid+1;//后面那个子序列的第一个元素的下标,后面子序列的最后一个元素的下标为right int index = 0;//临时数组的下标 //顺序表的合并 //按照从小到大,将两个子序列的元素按照顺序临时存放在temp[]中 while(i<=mid && j<=right){ //两个子序列都没到最后一个元素,循环,当其中一个到最后一个元素时,while循环停止 if(array[i]<=array[j]){ temp[index++] = array[i++]; }else{ temp[index++] = array[j++]; } } //上面while循环停止,将没到最后一个元素的那个子序列的后续元素加到已排序元素之后 while(i<=mid){ temp[index++] = array[i++]; } while(j<=right){ temp[index++] = array[j++]; } //本次操作将原数组中下标从left到right的元素排成有序的了,因此,将这几个元素拷贝到原数组中,这样,操作完成之后,原数组中的状态就是最后结果 index = 0; i=left; while(i<=right){ array[i++] = temp[index++]; } System.out.print("after merge--");listArray(array); } 原始数据:49 38 65 97 76 13 27 49 sub------0-3-7---49 38 65 97 76 13 27 49 sub------0-1-3---49 38 65 97 sub------0-0-1---49 38 sub------0-0-0---49 sub------1-1-1---38 after merge--38 49 65 97 76 13 27 49 sub------2-2-3---65 97 sub------2-2-2---65 sub------3-3-3---97 after merge--38 49 65 97 76 13 27 49 after merge--38 49 65 97 76 13 27 49 sub------4-5-7---76 13 27 49 sub------4-4-5---76 13 sub------4-4-4---76 sub------5-5-5---13 after merge--38 49 65 97 13 76 27 49 sub------6-6-7---27 49 sub------6-6-6---27 sub------7-7-7---49 after merge--38 49 65 97 13 76 27 49 after merge--38 49 65 97 13 27 49 76 after merge--13 27 38 49 49 65 76 97 13 27 38 49 49 65 76 97