您的位置:首页 > 其它

合并排序

2014-05-27 17:14 316 查看
非学无以广才,非志无以成学。——诸葛亮

/**
 * 
 * @author Jason Li 2014-5
 *  归并排序
 *
 */
public class MergeSort {

    public static void main(String[] args) {
        int[] dataArray = { 2, 6, 4, 9, 1, 7, 8, 3, 5 };
        MergeSort(dataArray, 0, dataArray.length - 1);
        ArrayUtils.print(dataArray);
    }

    // 合并排序
    private static void MergeSort(int[] dataArray, int p, int q) {
        if (p < q) {// 待排序部分多于1个元素时,分割
            int r = (p + q) >> 1; // 在中间点分割
            MergeSort(dataArray, p, r); // 递归左半边
            MergeSort(dataArray, r + 1, q);// 递归右半边
            Merge(dataArray, p, r, q);// 合并
        }
    }

    // 将已排好序的两部分合并到一起
    private static void Merge(int[] dataArray, int p, int r, int q) {

        int leftLength = r - p + 1; // 左边长度
        int rightLength = q - r; // 右边长度

        int[] leftArray = new int[leftLength]; // 左边临时数组
        int[] rightArray = new int[rightLength]; // 右边临时数组

        for (int i = 0; i < leftLength; i++) { // 左边部分
            leftArray[i] = dataArray[p + i];
        }
        for (int j = 0; j < rightLength; j++) { // 右边部分
            rightArray[j] = dataArray[r + 1 + j];
        }

        int leftIndex = 0;
        int rightIndex = 0;
        int dataIndex = p;

        // 合并
        while (leftIndex < leftLength && rightIndex < rightLength) {
            if (leftArray[leftIndex] < rightArray[rightIndex]) {
                dataArray[dataIndex++] = leftArray[leftIndex++];
            } else {
                dataArray[dataIndex++] = rightArray[rightIndex++];
            }
        }
        // 如果左边有剩余
        while (leftIndex < leftLength) {
            dataArray[dataIndex++] = leftArray[leftIndex++];
        }
        // 如果右边有剩余
        while (rightIndex < rightLength) {
            dataArray[dataIndex++] = rightArray[rightIndex++];
        }

    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: