归并排序

来源:互联网 发布:扫描编辑软件 编辑:程序博客网 时间:2024/06/07 06:39

1、复杂度分析
总的时间复杂度为O(nlogn),而且这是归并排序算法中最好、最坏、平均的时间性能。
由于归并排序在归并过程中需要与原始序列同样数量的存储空间存放归并结果以及递归时深度为这里写图片描述的栈空间,因此空间复杂度为O(n+logn).
另外,对代码进行仔细研究,发现merge函数中有if (a[i] < a[j]) 的语句,说明它需要两两比较,不存在跳跃,因此归并排序是一种稳定的排序算法。
也就是说,归并排序是一种比较占内存,但却效率高且稳定的算法。
2.源码实现

package edu.liangman.offer;/** * Created by lm on 2016/12/31. */public class Guibin {    public static void mearge(int arr[],int begin,int mid,int end){        int i = begin;    //待排序局部下标开始下标        int j = mid + 1;//待排序局部下标开始下标        int[] temp = new int[end-begin+1];// 缓存数组        int n = 0;//缓存数组的下标值        while(i<=mid&&j<=end){            if(arr[i]<=arr[j]){                temp[n++] = arr[i++] ;            } else{                temp[n++] = arr[j++] ;            }        }        while(i<=mid){              temp[n++]=arr[i++];        }        while(j<=end){              temp[n++]=arr[j++];        }        for(int k= 0;k<n;k++){            arr[begin+k]= temp[k] ;        }    }    public static void guibin(int[] arr,int begin,int end){        if(begin<end){            int mid = (begin+end)/2;            guibin(arr,begin,mid);            guibin(arr,mid+1,end);            mearge(arr,begin,mid,end);        }    }    public static void main(String[] args){        int arr[] = {1,3,5,6,2,4,7,1,123,345,234234};        //mearge(arr,0,3,arr.length-1);        guibin(arr,0,arr.length-1);        for(int i=0;i<arr.length;i++){            System.out.println(arr[i]);        }    }}

3.运行结果
这里写图片描述

0 0
原创粉丝点击