八大排序之归并排序

这篇博客详细介绍了归并排序的实现原理,它是一种基于分治法的排序算法。首先阐述了分治法的基本思想,即把大问题分解为小问题分别解决,再合并结果。接着解释了递归的概念,并给出了归并排序的递归过程。在算法描述部分,通过定义‘分’和‘合’两个步骤,展示了如何通过两个指针和一个临时数组来完成排序。最后,提供了完整的Java代码实现,包括主函数和归并排序及合并方法,用于展示归并排序的具体操作。
摘要由CSDN通过智能技术生成

归并排序:归并排序是分治法的一种实现算法

分治法的基本思想:将一个难以直接解决的大问题分解为多个可容易解决的规模较小的子问题,且须保证这些规模较小的子问题是相互独立与原问题是相同性质的,子问题的解合并可得原问题的解。分治法分为两步:1,。递归的分; 2.合并

递归的基本思想:自己直接或间接的调用自身的方法
递归要素:递归出口和递归方程 在递归中要先写递归出口再写递归方程

算法描述
1.分:在分的方法中定义先两个指针,一个 low 指针指向开头,一个 high 指向结尾;再定义一个指向中间位置的指针 mid ;要进行分的位置就是 mid 指针指向的位置,递归左边是从索引为 low 到 mid ;递归右边是从索引为 mid + 1 到 high 。
2.合并:定义两个指针和一个临时数组,分别指向两个要合并数组的开头,然后两个值一一比较,数值小的的元素往元素临时数组中插入,然后再插入数值大的,当把所有数据都放入到临时数组后,再将临时数组的元素一一对应放入到原数组中。

算法图解
在这里插入图片描述

动态图:
在这里插入图片描述

代码实现

public static void main(String[] args) {        
    int a[] = {6,5,3,1,8,7,2,4};        
    mergeSort(a, 0, a.length - 1);       
     System.out.println("排序结果:" + Arrays.toString(a));	
 }	       
  /**	 *  分的方法	 
  * @param a 传入待排序的数组	
  *  * @param low 开头位置的索引	
  *  * @param high 结尾位置的索引	 
  * */	
  public static void mergeSort(int[] a, int low, int high) {		
      
      //递归出口		
      if(low >= high) {			
      return;		
      }		

    //定义中间位置		
    int mid = (low + high)/2;		

    //递归左边		
    mergeSort(a, low, mid);		

    //递归右边		
    mergeSort(a, mid+1, high);		

    //合并		
    merge(a,low,mid,high);		
    System.out.println(Arrays.toString(a));  
     }	       

     /**	 *  合并的方法	 
     * @param a 待排序的数组	
     *  * @param low 开头位置的索引	 
     * * @param mid 中间位置的索引	 
     * * @param high 结尾位置的索引	 
     * */	
     public static void merge(int[] a, int low, int mid, int high) {		

    //定义第一个数组的的开始位置的索引		
    int s1 = low;		

    //定义第二个数组的开始位置的索引		
    int s2 = mid+1;		

    //定义临时数组		
    int[] temp = new int[high-low+1];		

    //定义临时数组的下标		
    int i = 0;		

    //判断大小将数组放入到临时数组当中去		
    while(s1<=mid && s2<=high) {			
        if(a[s1] <= a[s2]) {				
            temp[i++] = a[s1++];			
        }else {				
            temp[i++] = a[s2++];			
            }		
        }		

    //判断s1当中是否还剩有数据,如果有将其全部拷贝到临时数组当中去		
    while (s1 <= mid) {			
        temp[i++] = a[s1++];					
    }				

    //判断s1当中是否还剩有数据,如果有将其全部拷贝到临时数组当中去		
    while (s2 <= high) {			
        temp[i++] = a[s2++];					
    }				

    //将临时数组当中的数据放回原数组		
    for (int j = 0; j < temp.length; j++) {			
        a[j+low] = temp[j];		
    }			
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值