归并排序

来源:互联网 发布:淘宝装修视频代码 编辑:程序博客网 时间:2024/05/22 07:05

归并排序的JAVA实现

import java.util.Arrays;//归并排序之JAVA实现(迭代法)public class MergeSort {    public void Merge(int[] array, int low, int mid, int high) {        int i = low; // i是第一段序列的下标        int j = mid + 1; // j是第二段序列的下标        int k = 0; // k是临时存放合并序列的下标        int[] arrayTemp = new int[high - low + 1]; // arrayTemp是临时合并序列        // 扫描第一段和第二段序列,直到有一个扫描结束        while (i <= mid && j <= high) {            // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描            if (array[i] <= array[j]) {                arrayTemp[k] = array[i];                i++;// 小的往前走                k++;            } else {                arrayTemp[k] = array[j];                j++;// 小的往前走                k++;            }        }        // 若第一段序列还没扫描完,将其全部复制到合并序列        while (i <= mid) {            arrayTemp[k] = array[i];            i++;            k++;        }        // 若第二段序列还没扫描完,将其全部复制到合并序列        while (j <= high) {            arrayTemp[k] = array[j];            j++;            k++;        }        // 将合并序列复制到原始序列中        for (k = 0, i = low; i <= high; i++, k++) {            array[i] = arrayTemp[k];        }    }    /**     *      * @param array     *            待排序数组     * @param gap     *            归并子数组长度     * @param length     *            待排序数组的长度     */    public void MergePass(int[] array, int gap, int length) {        int i = 0; // 每趟合并的起始位置索引(都是从第一个开始)        // 归并gap长度的两个相邻子表        // (i + 2 * gap - 1) 本次合并的两组序列中右边序列的最后索引位置        // (i = i + 2 * gap) 下组合并的起始索引位置        // 通过(i + 2 * gap - 1 <length)的比较可        // 以判断出是否剩余两组可以进行合并,如果小于,说明至少还有两组可以进行合并,        // 如果不小于,说明只剩一组,对于剩下的一组,则不用关心        // 1、剩余一组,可能小于也可能等于一个gap长度        // 2、剩余两组,最后一组小于一个gap长度        for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap) {            Merge(array, i, i + gap - 1, i + 2 * gap - 1);// 此方法实现具体的比较过程            // 每一次排序往两个子数组之后,通过(i = i + 2 * gap)来索引到下一组待排序的子数组        }        // 当存在这样余下的两个子表,前者子数组的长度为当前gap,后者长度小于本次合并子序列的gap        // 通过(i + gap - 1 < length)的比较可以让最后一组合并到前面的大组中去。        System.out.println("(" + i + "+" + gap + "-1)=" + (i + gap - 1) + "==" + length);        if (i + gap - 1 < length) {            Merge(array, i, i + gap - 1, length - 1);// 如果配对完剩余一个子数组,则(i + gap -                                                        // 1)==(length - 1)        }    }    public int[] Sort(int[] list) {        int cishu = 0;        for (int gap = 1; gap < list.length; gap = 2 * gap) {            MergePass(list, gap, list.length);// 此方法实现具体的比较过程            System.out.println("归并排序第[" + (++cishu) + "]次:" + Arrays.toString(list));        }        return list;    }}
0 0
原创粉丝点击