二分归并排序

来源:互联网 发布:java符号 编辑:程序博客网 时间:2024/06/03 07:33

二分归并排序

归并排序建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。
将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
将两个有序序列,合并成一个新的有序序列,分别取两个有序序列的最小值,将两个最小值比较,取最小

最坏情况下时间复杂度:O(nlogn)
平均情况下时间复杂度:O(nlogn)

java实现

package com.cn;import java.util.Arrays;public class TwoDivisionSort {    public static void main(String[] args) {        int[] a = {45,36,18,53,72,30,48,93,15,36};        TwoDivisionSort td = new TwoDivisionSort();        td.Sort(a, 0, a.length-1);        System.out.println(Arrays.toString(a));    }    //二分排序    public void Sort(int[] a,int start,int end){        if(start < end){            int mid = (start + end)/2;            //左            Sort(a,start,mid);            //右            Sort(a,mid+1,end);            //左右归并成一个新的有序序列            Merge(a,start,mid,end);        }    }    //将两个有序序列合并成一个有序序列    public void Merge(int[] a,int start,int mid,int end){        int[] num = new int[end-start+1];//用于存放新排好序的序列        int s1 = start;//第一个序列的起始下标        int s2 = mid + 1;//第二个序列的起始下标        int i = 0;//num[]数组的起始下标        //通过比较将较小元素先放入num数组        while(s1 <= mid && s2 <= end){            if(a[s1] < a[s2]){                num[i] = a[s1];                ++i;                ++s1;            }else{                num[i] = a[s2];                ++i;                ++s2;            }        }        //将第一个序列的剩余元素放入num[]        while(s1 <= mid){            num[i] = a[s1];            ++i;            ++s1;        }        //将第二个序列的剩余元素放入num[]        while(s2 <= end){            num[i] = a[s2];            ++i;            ++s2;        }        //将num[]中的元素复制到数组a        for(int j = 0;j < num.length;j++){            a[j+start] = num[j];        }    }}
0 0
原创粉丝点击