归并排序
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的个答案修补在一起,即分而治之)
简单图解
再来看看治阶段,我们需要将连个已经有序的子序列合并成一个有序序列
合并相邻有序子序列示意图(最后一次合并的示意图)
代码如下
//分+合的方法
public static void mergeSort(int [] arr,int left,int right,int [] temp){
if(left < right){
int mid = (left + right) / 2;
//需要注意向左和向右的left/right的条件
mergeSort(arr,left,mid,temp);//左递归分解
mergeSort(arr,mid,right,temp);//右递归分解
merge(arr,left,mid,right,temp);//合并排序
}
}
//合并的方法
public static void merge(int [] arr,int left,int mid,int right,int [] temp){
int i = left;//初始化i,左边有序序列的初始索引
int j = mid + 1;//初始化j,右边有序序列的初始索引
int t = 0;//指向temp数组的当前索引
//将左右两端有序序列填充到temp中,直到一端添加完毕
while(i <= mid && j<= right){
if(arr[i] <= arr[j]){
temp[t] = arr[i];
t++;
i++;
}else{
temp[t] = arr[j];
t++;
i++;
}
}
//把剩余数据的一边的数据依次填充到temp
while(i <= mid){
temp[t] = arr[i];
i++;
t++;
}
while(j <= right){
temp[t] = arr[j];
j++;
t++;
}
//将temp数组数据拷贝到原始数组中
t= 0;
int tempLeft = left;
while(tempLeft < right){
arr[tempLeft] = arr[t];
t++;
tempLeft++;
}
}
建议Debug跟代码,更容易理解起来,递归还是稍微有点不好理解的