欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

数据结构-归并排序,数据结构归并排序,归并排序(泛型)[ Co

来源: javaer 分享于  点击 1642 次 点评:215

数据结构-归并排序,数据结构归并排序,归并排序(泛型)[ Co


归并排序(泛型)

[ Compare类见前面冒泡查找 ]

package com.algorithm.sorting;import java.util.ArrayList;import java.util.List;import com.algorithm.utils.Compare;/* * Merge sortting 归并排序 * time:O(N*logN) */public class Merge<E> {    /*     *  sort array     */    public void sort(E list[]) {         divide(list, 0, list.length - 1);    }    public void divide(E list[], int left, int right) {        if (left < right) {            int mid = (left + right) / 2;            divide(list, left, mid);// sort left            divide(list, mid + 1, right);// sort right            merge(list, left, mid, right);// merge        }    }    public void merge(E list[], int leftstart, int mid, int rightend) {        Compare compare = new Compare();        int start = leftstart;//必须单独记住开始下标 start        int leftend = mid;        int rightstart = mid + 1;        int k = 0;        int size = rightend - leftstart + 1;        E[] temp = (E[]) new Object[size];        while (leftstart <= leftend && rightstart <= rightend) {            if (compare.compare(list[leftstart], list[rightstart]) < 0) {                temp[k++] = list[leftstart++];            } else {                temp[k++] = list[rightstart++];            }        }        while (leftstart <= leftend) {            temp[k++] = list[leftstart++];        }        while (rightstart <= rightend) {            temp[k++] = list[rightstart++];        }        /*         * copy temp array back to list attention          * 必须单独记住开始下标 start         */        for (int i = 0; i < temp.length; i++) {            list[start + i] = temp[i];        }    }    /*     *  sort colllection     */    public List<E> sort(List<E> list) {        return divide(list, 0, list.size() - 1);    }    public List<E> divide(List<E> list, int left, int right) {        if (left < right) {            int mid = (left + right) / 2;            divide(list, left, mid);            divide(list, mid + 1, right);            merge(list, left, mid, right);        }        return list;    }    public void merge(List<E> list, int leftstart, int mid, int rightend) {        Compare compare = new Compare();        int start = leftstart;        int leftend = mid;        int rightstart = mid + 1;        int k = 0;        List<E> temp = new ArrayList<E>();        while (leftstart <= leftend && rightstart <= rightend) {            if (compare.compare(list.get(leftstart), list.get(rightstart)) <= 0) {                temp.add(k++, list.get(leftstart++));            } else {                temp.add(k++, list.get(rightstart++));            }        }        while (leftstart <= leftend) {            temp.add(k++, list.get(leftstart++));        }        while (rightstart <= rightend) {            temp.add(k++, list.get(rightstart++));        }        /*         * 因为集合的数据如果超出容量的话,集合会自动扩容,添加在尾部。         *  如果采用add方法的话,list集合会不断扩大,而不是达到交换数据目的。         * 所以应该采用set方法,修改数据,达到交换数据的目的。         */        for (int i = 0; i < temp.size(); i++) {            list.set(start + i, temp.get(i));        }    }}//该片段来自于http://byrx.net
相关栏目:

用户点评