归并排序的基本原理为:
一:拆分,假设有N个元素的列表,将这个列表拆分成2个或两个以上元素组成的新的列表,然后分别对子列表进行排序
二:归并,把所有的排好序的子类表两两归并,如此重复,直到归并成一个含N个有序列表为止
归并排序其实和快速排序都是同一种思想的排序算法,其采用的都是分治法的基本思想,即:将问题分解成一个个小的问题,分而治之。
public class Mergesort { /* * leftPos左数组的第一个元素的下标 * leftEnd左数组的最后一个元素的下标 * rightPos右数组第一个元素的下标 * rightEnd 右数组最后一个元素的下标*/ private static <Integer extends Comparable<? super Integer>> void meger(int []a, int[]tmpArray,int leftPos,int rightPos,int rightEnd){ int leftEnd = rightPos-1; int tmpPos = leftPos; int numElements = rightEnd - leftPos +1; //将两数组最最小的放入数组tmpArrray中 while(leftPos<=leftEnd&&rightPos<=rightEnd){ if(a[leftPos]-(a[rightPos])<=0){ tmpArray[tmpPos++] = a[leftPos++]; }else{ tmpArray[tmpPos++]=a[rightPos++]; } } //两数组中的另外一个数组的元素放入temArray中 while(leftPos<=leftEnd){ tmpArray[tmpPos++]=a[leftPos++]; } while(rightPos<=rightEnd){ tmpArray[tmpPos++]=a[rightPos++]; } //将中间数组中的内容复制回原数组 for(int i=0;i<numElements;i++,rightEnd--){ a[rightEnd]=tmpArray[rightEnd]; } for(int i = 0;i<tmpArray.length;i++){ System.out.print(tmpArray[i]+","); } System.out.println(); } /* * left 待排数组的第一个元素的索引 * right 待排数组的最后一个元素的索引 * a 待排数组 * tmpArray 归并后的数组 * center左边数组的最后一个元素的下标 */ private static <Integer extends Comparable <? super Integer>> void mergeSort(int[]a, int []tmpArray,int left,int right){ if(left<right){ int center =(left+right)/2; //对左边数组进行递归,在递归的过程中直到将左边数组拆分成元素为一的新的数组 mergeSort(a,tmpArray,left,center); //对左边数组进行递归,在递归的过程中直到将右边数组拆分成元素为一的新的数组 mergeSort(a,tmpArray,center+1,right); //合并数组 meger(a,tmpArray,left,center+1,right); } } public static void main(String[] args) { Mergesort sort = new Mergesort(); int num[]={5,7,3,8,1,4,9,2,6}; int num2[] = new int[9]; sort.mergeSort(num, num2, 0, num.length-1); for (int i = 0; i < num2.length; i++) { System.out.print(num2[i]+","); } System.out.println(); for (int i = 0; i < num2.length; i++) { System.out.print(num[i]+","); } } } 输出结果为: 每次数组合并之后的结果: 5,7,0,0,0,0,0,0,0, 3,5,7,0,0,0,0,0,0, 3,5,7,1,8,0,0,0,0, 1,3,5,7,8,0,0,0,0, 1,3,5,7,8,4,9,0,0, 1,3,5,7,8,4,9,2,6, 1,3,5,7,8,2,4,6,9, 1,2,3,4,5,6,7,8,9, 所有数组合并完成之后的数组 1,2,3,4,5,6,7,8,9, 原有的数组排序之后: 1,2,3,4,5,6,7,8,9,