归并排序图解
归并排序思路
归并排序将一个无序数组,逐渐分解,当分解的最小单位为1的时候开始逐渐合并为若干个有序数组,当合并数组的数量为1的时候合并结束,这时候合并操作将是一个重要的操作,因为每次合并都是将两个无序数组合并为新的有序数组。
归并排序合并举例说明
步骤说明
以合并一个4,5,7,8,1,2,3,6数组为例
数组被拆分为4,5,7,8与1,2,3,6两个数组
1、 初始化一个临时数组用来临时存放合并后的数据;
2、 4与1比较,1小与4,1放入临时数组;
3、 4与2比较,2小与4,2放入临时数组;
4、 4与3比较,3小与4,3放入临时数组;
5、 4与6比较,4小与6,4放入临时数组;
6、 这时候数组1,2,3,6已经扫描完毕,将数组4,5,7,8剩下的数据依次拷贝到临时数组中;
7、 最后,将临时数组的值赋值到原始数组中;
图解说明
归并排序代码
public class MergetSort {
public static void main(String[] args) {
int arr[] = {
8, 4, 5, 7, 1, 3, 6, 2 };
int temp[] = new int[arr.length]; //归并排序需要一个额外空间
mergeSort(arr, 0, arr.length - 1, temp);
System.out.println("归并排序后=" + Arrays.toString(arr));
}
//分+合方法
public static void mergeSort(int[] arr, int left, int right, int[] temp) {
if(left < right) {
int mid = (left + right) / 2; //中间索引
//向左递归进行分解
mergeSort(arr, left, mid, temp);
//向右递归进行分解
mergeSort(arr, mid + 1, right, temp);
//合并
merge(arr, left, mid, right, temp);
}
}
//合并的方法
/**
*
* @param arr 排序的原始数组
* @param left 左边有序序列的初始索引
* @param mid 中间索引
* @param right 右边索引
* @param 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];
i++;
} else {
temp[t] = arr[j];
j++;
}
t++;
}
//把有剩余数据的一边的数据依次全部填充到temp
while (i <= mid) {
temp[t] = arr[i];
t++;
i++;
}
while (j <= right) {
temp[t] = arr[j];
t++;
j++;
}
//将temp数组的元素拷贝到arr,拷貝的是部分
t = 0;
int leftTemp = left;
while (leftTemp <= right) {
arr[leftTemp] = temp[t];
leftTemp++;
t++;
}
}
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: