算法设计与分析笔记——合并排序

来源:互联网 发布:网络推广产品代理 编辑:程序博客网 时间:2024/05/22 16:01

简介

合并排序算法是用分治策略实现对n个元素进行排序的算法。其 基本思想 是:将待排序元素分成大小大致相容的2个子集合,分别等于2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

·

图解:

这里写图片描述

非递归合并排序算法

public static void mergeSort(Comparable a[], int left, int right){    Comparable []b = new Comparable[a.length];    int s = 1;    while(s < a.length){        mergePass(a, b, s);   // 合并到数组b        s += s;        mergePass(b, a, s);   // 合并到数组a        s += s;    }}

合并排序递归算法

public static void mergeSort(Comparable a[], int left, int right){    if(left < right){//至少有两个元素        int i = (left + right) / 2;     // 取中点        mergeSort(a, left, i);        mergeSort(a, i + 1, right);        merge(a, b, left, i, right);    // 合并到数组b        copy(a, b, left, right);        // 复制回数组a    }
辅助算法
> `public static void mergePass(Comparable []x , Comparable []y , int s){     // 合并大小为s的相邻子数组     int i = 0;      while(i <= x.length - 2 * s){            merge(x, y, i, i+s-1, i+2*s-1);            i = i + 2 * s;        }        // 剩下的元素个数少于2s        if(i + s < x.length)            merge(x, y, i+s-1, x.length - 1);        else            for(int j = i; j < x.length; j++)                y[j] = x[j];        }`> `public static void merge(Comparable []c , Comparable []d , int l, int m, int r){        // 合并c[1:m]和c[m+1:r]到d[1:r]        int i = 1, j = m+1, k = 1;        while((i <= m) && (j <= r))            if(c[i].compareTo(c[j]) <= 0)                d[k++] = c[i++];            else d[k++] = c[j++];        if(i > m)            for(int q = j; q <= r; q++)                d[k++] = c[q];        else            for(int q = i; q <= m; q++)                d[k++] = c[q];    }
阅读全文
0 0
原创粉丝点击