1.归并排序(两路归并排序)
利用归并思想排序,从小集合归并到大集合。
步骤:
分而治之,每个递归过程设计三个步骤。
①分解。吧待排序的n个数分解为两个子序列,每个序列包括n/2个元素
②治。把每个子序列进行归并排序,进行递归。
③合并。合并两个排序好的子序列。
//将数组划分 public static int[] mergesort(int []a,int low,int high){ int mid=(high+low)/2; if(high>low) { //左边 mergesort(a, low, mid); //右边 mergesort(a, mid + 1, high); //归并 merge(a, low, mid, high); } return a; } //归并排序 private static void merge(int[] a, int low, int mid, int high) { int i=low;//左边指针 int j=mid+1;//右边指针 int k=0;//临时数组指针 int temp[]=new int[high-low+1];//临时数组存放归并值 while(i<=mid && j<=high){ if(a[i]>a[j]){ //右边小值放入临时数组 temp[k++]=a[j++]; }else{ //左边小值放入临时数组 temp[k++]=a[i++]; } } //左边剩余放入 while (i<=mid){ temp[k++]=a[i++]; } while(j<=high){ temp[k++]=a[j++]; } for(int m=0;m<temp.length;m++){ a[m+low]=temp[m]; } }