思想:
归并排序 是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。
治:
上代码:
//分 public static void mergesort(int []data,int left,int right) //;left right { //左 右 //0 1 2 3 4 5 if(left >= right) { return;//一个元素, } int center=(right+left)/2;//切半 mergesort(data,left, center);//左边 mergesort(data, center+1,right);//左边右边 merge(data,left,center,right); //归并 } //治 public static void merge(int []data,int left,int center ,int right) { //left -center center +1 right int [] tempdata=new int [data.length];//创建临时数组,归并 int mid=center+1;//两个数组分割线 int temppos=left;//临时数组的索引,0-> int templeft=left;//左边数组的索引 while( left<=center && mid<=right )//处理两个数组归并 { if(data[left] <=data[mid]) { tempdata[temppos]=data[left];//保存小的数据 temppos++; left++; } else { tempdata[temppos]=data[mid];//保存小的数据 temppos++; mid++; } } //没有结束的链接起来 while(mid<=right) { tempdata[temppos]=data[mid]; temppos++; mid++;//移动 } while(left<=center) { tempdata[temppos]=data[left]; temppos++; left++;//移动 } while(templeft<=right)//拷贝回去 { data[templeft]=tempdata[templeft]; templeft++; } }
参考: