import java.util.Arrays;
/*
* 归并算法的思想:
* 1.先给出参数(int[] arr, int left, int middle, int right)
* 2.给出一个数组,把他分成两份,以middle作为分隔点
* 3.然后比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
* 重复步骤3直到某一指针超出序列尾将另一序列剩下的所有元素直接复制到合并序列尾
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr = {1,3,5,2,4,6,8};
System.out.println(Arrays.toString(arr));
mergeSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr, int left, int right){
int middle = (left+right)/2;
if(left < right){
// 处理左边数组的数据
mergeSort(arr, left, middle);
// 右边
mergeSort(arr, middle+1, right);
merge(arr, left, middle, right);
}
}
public static void merge(int[] arr, int left, int middle, int right){
// 因为要取下标所以加1
int[] temp = new int[right - left + 1];
// 记录第一个数组中需要遍历的下标
int i = left;
// 第二个数组
int j = middle+1;
// 用于记录临时数组的下标
int index = 0;
while(i<=middle && j<=right){
if(arr[i] < arr[j]){
temp[index++] = arr[i++];
}else {
temp[index++] = arr[j++];
}
}
// 处理多余的数据
while(i <= middle){
temp[index++] = arr[i++];
}
while(j <= right){
temp[index++] = arr[j++];
}
for(int k = 0; k < temp.length; k++){
arr[left+k] = temp[k];
}
}
}
聋 发布了20 篇原创文章 · 获赞 0 · 访问量 471 私信 关注