前奏
该算法是采用分治法的典型应用,将一个无序序列分组诺干个,然后对该小组进行排序,排序完以后,将各个小组合并排序比较,直到将诺干个小组组合成一组就是一个有序列表了
思路 提示:使用了回溯思想、拆到不能再拆的时候才进行排序比较
1:将一个无序列表依次的回调拆分成诺干个小组(提示:小组里面的元素可以是一个最多是2个)先将左边的进行拆分合并排序,在执行右边的拆分排序
2:然后无法回调的时候就将当前小组内容进行合并排序,然后返回到拆分为当前层的层栈上进行合并排序,依次类推
提示:需要在创建一个同大小的数组 该数组是用来进行临时排序存储合并用的 所谓的空间换时间
课外仅供参考
如果与一组8000个数据的数组排序的情况下 时间差不多3毫秒不到
如果与一组80000个数据的数组排序的情况下 时间差不多30毫秒不到
如果与一组800000个数据的数组排序的情况下 时间差不多150毫秒不到
如果与一组8000000个数据的数组排序的情况下 时间差不多1.3秒不到
如果与一组80000000个数据的数组排序的情况下 时间差不多15秒不到
归并是先使劲的递归递归到不能在递归才进行排序合并、而且快速排序排序一次在进行递归
图解 1
图解2
代码
注意:这里的count对应的索引值是当前区域的left ,然后将当前内容赋值给temp也是对应当前count索引
提示:如果将从小到大顺序变成从大到小顺序,改对应的将> 改成<
//归并排序方法
public class MergeSortDemo {
public static void main(String[] args) {
int [] arr={123,1,412,3,12,1,23,12,3,1,23,123,12,3123,12,3,123};
MergeSort.mergeSort(arr,0,arr.length-1,new int[arr.length]);
System.out.println(Arrays.toString(arr));
}
}
class MergeSort{
public static void mergeSort(int orderByArrat[],int left,int right,int tempArray[]){
if(right<=left)return;
//获取中间值
int midIndex=(left+right)/2;
//获取移动指针
int moveLeftPoint=left;
int moveRightPoint= midIndex+1;
int count=left;
//先往左边进行再次拆分
mergeSort(orderByArrat,left,midIndex,tempArray);
mergeSort(orderByArrat,moveRightPoint,right,tempArray);
//排序当前对应的索引信息
while(moveLeftPoint<=midIndex&&moveRightPoint<=right){
if(orderByArrat[moveRightPoint]>orderByArrat[moveLeftPoint]){
tempArray[count++]=orderByArrat[moveLeftPoint++];
}else{
tempArray[count++]=orderByArrat[moveRightPoint++];
}
}
while(moveLeftPoint<=midIndex){
tempArray[count++]=orderByArrat[moveLeftPoint++];
}
while(moveRightPoint<=right){
tempArray[count++]=orderByArrat[moveRightPoint++];
}
count=left;
while(count<=right){
orderByArrat[count]=tempArray[count];
count++;
}
}
}