码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法-归并排序MergetSort

时间:2021-04-10 13:21:25      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:sys   一个   size   class   技术   lazy   方向   java   sort   

归并排序介绍

一种分而治之思想

归并排序步骤

  1. 从下往上的归并排序(自下而上的迭代)

  2. 从上往下的归并排序(自上而下的递归):它与"从下往上"在排序上是反方向的。它基本包括3步:
    ① 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2;
    ② 求解 -- 递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归并排序。递归的终结条件是子区间长度为1。
    ③ 合并 -- 将已排序的两个子区间a[low...mid]和 a[mid+1...high]归并为一个有序的区间a[low...high]。

技术图片

时间复杂度

平均时间复杂度 O(nlogn)

最坏时间复杂度 O(nlogn)

最好时间复杂度 O(nlogn)

该算法数据稳定

伪代码

function mergeSort
if left<right
	mid=(left+right)/2
	mergeSort:left-mid //左半部分递归分解
	mergeSort:mid+1-right //右半部分递归分解
	merge 合并
function merge
	左右两边数据比较,小的放入temp数组,继续比较,直到把一边比完,剩余的全部放入temp
	把temp赋值给arr数组
	

代码

package Sort;

import java.util.Arrays;

public class MergeSort2 {
    public static void main(String[] args) {
        int[] arr = {10,-1,-3,13,234,35,-9,3};
        System.out.println(Arrays.toString(arr));
        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);
        }
    }

    public static void merge(int[] arr,int left,int mid,int right,int[] temp){
        int i=left;
        int j=mid+1;
        int t=0;
        while(i<=mid&&j<=right){
            if(arr[i]<arr[j]){
                temp[t]=arr[i];
                i++;
                t++;
            }else{
                temp[t]=arr[j];
                j++;
                t++;
            }
        }

        while(i<=mid){
            temp[t]=arr[i];
            i++;
            t++;
        }

        while(j<=right){
            temp[t]=arr[j];
            j++;
            t++;
        }

        t=0;
        int tempLeft=left;
        while(tempLeft<=right){
            arr[tempLeft]=temp[t];
            t++;
            tempLeft++;
        }
        //赋值不是一次完成
        //是0-1 2-3 0-3 4-5 6-7 4-7 0-7完成
    }
}

参考:https://www.cnblogs.com/skywang12345/p/3602369.html

排序算法-归并排序MergetSort

标签:sys   一个   size   class   技术   lazy   方向   java   sort   

原文地址:https://www.cnblogs.com/youngst/p/14639145.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!