• 【排序算法】(4)归并排序


    归并排序


    2019-11-10  11:41:59  by冲冲

    1、概念

    归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略。

    分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之。

    2、基本思想

    归并排序采用递归实现(也可以采用迭代的方式实现)。分阶段就是递归拆分子序列的过程,递归深度为log2n。

    合并相邻有序子序列

    治阶段就是将两个已经有序的子序列合并成一个有序序列,比如最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

    3、完整代码

     1 public class MergeSort {
     2     public static void main(String []args){
     3         int i;
     4         int []a = {9,8,7,6,5,4,3,2,1};
     5 
     6         System.out.printf("before sort:");
     7         for (i=0; i<a.length; i++){
     8             System.out.printf("%d ", a[i]);
     9         }
    10         System.out.printf("
    ");
    11 
    12         mergeSort(a);
    13 
    14         System.out.printf("after  sort:");
    15         for (i=0; i<a.length; i++){
    16             System.out.printf("%d ", a[i]);
    17         }
    18         System.out.printf("
    ");
    19     }
    20 
    21     public static void mergeSort(int []arr){
    22         int []temp = new int[arr.length];
    23         //在排序前,先建好一个长度等于原数组长度的临时数组,
    24         //避免递归中频繁开辟空间
    25         mergeSort(arr,0,arr.length-1,temp);
    26     }
    27 
    28     private static void mergeSort(int[] arr,int left,int right,int []temp){
    29         if(left<right){
    30             int mid = (left+right)/2;
    31             mergeSort(arr,left,mid,temp);
    32             //左边归并排序,使得左子序列有序
    33             mergeSort(arr,mid+1,right,temp);
    34             //右边归并排序,使得右子序列有序
    35             merge(arr,left,mid,right,temp);
    36             //将两个有序子数组合并操作
    37         }
    38     }
    39     
    40     private static void merge(int[] arr,int left,int mid,int right,int[] temp){
    41         int i = left;//左序列指针
    42         int j = mid+1;//右序列指针
    43         int t = 0;//临时数组指针
    44         while (i<=mid && j<=right){
    45             if(arr[i]<=arr[j]){
    46                 temp[t++] = arr[i++];
    47             }else {
    48                 temp[t++] = arr[j++];
    49             }
    50         }
    51         while(i<=mid){//将左边剩余元素填充进temp中
    52             temp[t++] = arr[i++];
    53         }
    54         while(j<=right){//将右序列剩余元素填充进temp中
    55             temp[t++] = arr[j++];
    56         }
    57         t = 0;
    58         //将temp中的元素全部拷贝到原数组中
    59         while(left <= right){
    60             arr[left++] = temp[t++];
    61         }
    62     }
    63 }
    before sort:  9 8 7 6 5 4 3 2 1 
    after  sort:  1 2 3 4 5 6 7 8 9 
  • 相关阅读:
    opencv入门踩坑之路(一)
    编写vue的时候(html也一样),限制一个div内可显示的字数
    win10开机后内存占用非常高,但是资源管理器显示的进程占用得很少,可以考虑更新驱动
    java 随机数产生 常用类及方法
    你不会的是这个正则表达式吗?
    系统编程第三次上机
    Java第三次上机随笔
    系统编程第二次实验
    Java第二次上机随笔
    面向对象-Java MOOC翁恺老师第一次作业
  • 原文地址:https://www.cnblogs.com/yadiel-cc/p/11829394.html
Copyright © 2020-2023  润新知