11、数据结构与算法-排序算法-归并排序-笔记整理

归并排序图解

*

归并排序思路

归并排序将一个无序数组,逐渐分解,当分解的最小单位为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++;
        }

}

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: