归并排序

归并排序

归并排序的大致思想就是:先把数据划分成若干个有序的数组,把两个有序的数组和合并成一个数组,直到合并成一个数组.

所以实现过程就分为两个部分:

  • 把一个乱序的数组划分成若干个有序的数组.(这个很简单,每个数组里都只有一个数,不就是有序的吗?)
  • 把这些数组不断合并直到合并成一个有序的数组

划分成若干个有序数组的实现

    
    /**
     * @param data 存储数据的数组
     * @param begin 划分的开始位置
     * @param end 划分的结束位置
     * 表述均是[begin,end)左闭右开
     */
    public static void sort(int[] data, int begin, int end) {
        int mid = (begin + end) / 2;
        if (mid > begin) {
            sort(data, begin, mid);
            sort(data, mid, end);
        }
        merge(data, begin, mid, mid, end);//合并数组
    }

合并数组的实现

    /**
     * @param data 存储数据的数组
     * @param b1 第一个数组的开始位置
     * @param e1 第一个数组的结束位置
     * @param b2 第二个数组的开始位置
     * @param e2 第二个数组的结束位置
     * 两个数组的开始结束位置的表述均是[begin,end)左闭右开
     */
    private static void merge(int[] data, int b1, int e1, int b2, int e2) {
        ArrayList<Integer> list = new ArrayList<>();//追求性能不应该用list的,声明一个e2-b1大小的数组代替掉这个就可以.
        //合并两个有序数组,这个过程很好实现,不多说了
        for (int i = b1, j = b2; i < e1 || j < e2; ) {
            if (i == e1) {
                list.add(data[j]);
                j++;
            } else if (j == e2) {
                list.add(data[i]);
                i++;
            } else if (data[i] <= data[j]) {
                list.add(data[i]);
                i++;
            } else if (data[i] > data[j]) {
                list.add(data[j]);
                j++;
            }
        }
        //把合并的后的有序数组,写到data数组中
        int j = 0;
        for (int i = b1; i < e2; i++) {
            data[i] = list.get(j);
            j++;
        }
    }

示例

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class MergeSort {

    public static void sort(int[] data, int begin, int end) {
        int mid = (begin + end) / 2;
        if (mid > begin) {
            sort(data, begin, mid);
            sort(data, mid, end);
        }
        merge(data, begin, mid, mid, end);
    }

    private static void merge(int[] data, int b1, int e1, int b2, int e2) {
        ArrayList<Integer> list = new ArrayList<>();

        for (int i = b1, j = b2; i < e1 || j < e2; ) {
            if (i == e1) {
                list.add(data[j]);
                j++;
            } else if (j == e2) {
                list.add(data[i]);
                i++;
            } else if (data[i] <= data[j]) {
                list.add(data[i]);
                i++;
            } else if (data[i] > data[j]) {
                list.add(data[j]);
                j++;
            }
        }
        int j = 0;
        for (int i = b1; i < e2; i++) {
            data[i] = list.get(j);
            j++;
        }
    }

    public static void main(String[] args) {

        int []data=new int[100];
        Random random=new Random();
        for (int i = 0; i <data.length ; i++) {
            data[i]=random.nextInt(Integer.MAX_VALUE);
        }
        System.out.println(Arrays.toString(data));
        sort(data,0,data.length);
        System.out.println(Arrays.toString(data));

    }
}

posted @ 2020-05-13 20:15  continued258  阅读(100)  评论(0)    收藏  举报