经典排序之归并排序

来源:互联网 发布:movist for mac 1.4.2 编辑:程序博客网 时间:2024/05/22 08:14
package 归并排序;
/*
 * 归并排序的思想:将数组从中间分开,然后利用递归的方法将左右子序列均拆开
 * 再借助一个数组归并左右序列,排序是在归并时进行的,最后将数据复制到原始数组中
 */

public class mergeSort {
        //要排序的数组
    private static int[] array = { 12,34,2543,54324,764,43,247,464,34};
    public static void main(String[] args) {
        //先判断一下是否需要用到归并数组,如果数目较少,比如只有5个时,使用选择排序等方法
        if(array.length<5){
            selectSort(array);
            //查看结果
            for (int i = 0; i < array.length; i++) {
                System.out.print(array[i]+", ");
            }
            return;
        }
        
        //数组中与元素较多时使用归并排序
        mergesort(array, 0, array.length - 1);
        //打印结果
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+", ");
        }
        System.out.println();
    }

    
    //具体的归并排序方法
    public static void mergesort(int[] a, int first, int last) {
        System.out.println("归并排序。。。");
        int mid;
        int[] b = new int[last-first+1];  //需要借助的临时数组
        if (first >= last){
            return;
        }
        else {
            mid = (first + last) / 2;
            mergesort(a, first, mid); // 递归的思想
            mergesort(a, mid + 1, last);

            //将左右子序列归并到一起,利用那个临时数组
            int beginHalf1 = first;
            int endHalf1 = mid;
            int beginHalf2 = mid + 1;
            int endHalf2 = last;
            int index = 0;
            for (; beginHalf1 <= endHalf1 && beginHalf2 <= endHalf2; index++) {
                if (a[beginHalf1] <= a[beginHalf2]) {
                    b[index] = a[beginHalf1];
                    beginHalf1++;
                } else {
                    b[index] = a[beginHalf2];
                    beginHalf2++;
                }

            }

            // 一个子数组已经全部复制到临时数组中了,然后将另一数组中剩下的元素复制到临时数组中
            while (beginHalf1 <= endHalf1) {
                b[index++] = a[beginHalf1++];
            }
            while (beginHalf2 <= endHalf2) {
                b[index++] = a[beginHalf2++];
            }
            
            //复制回去
            for(int z=0;z<b.length;z++){
                a[first+z]=b[z];          //最容易出错的地方
            }



        }//end else
    
    }
    
    
    //选择排序
    public static void selectSort(int[]a){
        System.out.println("选择排序。。。");
        for(int i = 0; i < a.length; i++){
            int index = selectMinIndexOfArray(a,i);
            swap(a,index,i);
        }
    }
    public static int selectMinIndexOfArray(int[]a,int i){
        int min = a[i];
        int minIndex = i;
        for(int j = i; j < a.length; j++){
            if(a[j]<min){
                min = a[j];
                minIndex = j;
            }
        }
        return minIndex;
    }
    public static void swap(int[]a,int i,int j){
        int item;
        item = a[i];
        a[i] = a[j];
        a[j] = item;
    }

}


原创粉丝点击