排序之归并排序

归并排序算法思想: 
分而治之(divide - conquer);每个递归过程涉及两个步骤 
第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素. 
第二, 合并: 合并两个排好序的子序列,生成排序结果. 

第一步:

public static void mergeInternal(int[] arr,int low,int high) {
        if(low>=high) return;
        int mid = (high - low)/2+low;
        //左边小数组
        mergeInternal(arr, low, mid);
        //右边小数组
        mergeInternal(arr, mid+1, high);
        //合并
        merge(arr,low,mid,high);
    }

第二步:

public static void merge(int[] arr,int p,int q,int r) {
        int i = p;
        int j = q+1;
        //定义新数组tmp
        int[] tmp = new int[r-p+1];
        int k = 0;
        //将数组前半部分和后半部分按大小放在tmp数组中
        while(i<=q&&j<=r) {
            if(arr[i]>arr[j]) {
                tmp[k++] = arr[j++];
            }else {
                tmp[k++] = arr[i++];
            }
        }
        //记录当前i和q
        int start = i;
        int end = q;
        //判断后半部分是否全部加入tmp数组中,没有赋给分别将j和r赋给start和end
        if(j<=r) {
            start = j;
            end = r;
        }
        //把剩余元素放在tmp后即可
        while(start<=end) {
            tmp[k++] = arr[start++];
        }
        //将tmp数组值赋给原数组
        /*for(i = 0;i<r-p+1;i++) {
            arr[p+i] = tmp[i];
        }*/
        System.arraycopy(tmp, 0, arr, p, tmp.length);
    }

main函数:

public static void main(String[] args) {
        int[] arr = {11,8,3,9,7,1,2,5};
                System.out.println(Arrays.toString(arr));
        mergeInternal(arr, 0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }    

运行结果:

[11, 8, 3, 9, 7, 1, 2, 5]
[1, 2, 3, 5, 7, 8, 9, 11]

posted @ 2019-03-12 22:57  码到成功hy  阅读(483)  评论(0编辑  收藏  举报
获取

hahah

name age option