排序之归并排序java版

public class MergeSort {
    /*
    //相对好理解的merge算法
    public void Merge(int low,int mid,int high,int []array) {

    int i = low; // i是第一段序列的下标

    int j = mid + 1; // j是第二段序列的下标

    int k = 0; // k是临时存放合并序列的下标

    int[] array2 = new int[high - low + 1]; // array2是临时合并序列



    // 扫描第一段和第二段序列,直到有一个扫描结束

    while (i <= mid && j <= high) {

        // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描

        if (array[i] <= array[j]) {

            array2[k] = array[i];

            i++;

            k++;

        } else {

            array2[k] = array[j];

            j++;

            k++;

        }

    }



    // 若第一段序列还没扫描完,将其全部复制到合并序列

    while (i <= mid) {

        array2[k] = array[i];

        i++;

        k++;

    }



    // 若第二段序列还没扫描完,将其全部复制到合并序列

    while (j <= high) {

        array2[k] = array[j];

        j++;

        k++;

    }



    // 将合并序列复制到原始序列中

    for (k = 0, i = low; i <= high; i++, k++) {

        array[i] = array2[k];

    }

}
*/
    //合并
    public static int[] merge(int low,int middle,int high,int []array){

        int arrLength=array.length;
        int []tempArr=new int[arrLength];
        //要合并的左右两半拷贝到tempArr中
        for(int i=low;i<=high;i++){
            tempArr[i]=array[i];
        }
        int arrLeft=low;
        int arrRight=middle+1;
        int current=low;
        //遍历数组,比较左右两半的元素将较小的元素复制到原先的数组中
        while(arrLeft<=middle&&arrRight<=high){
            if(tempArr[arrLeft]<=tempArr[arrRight]){
                array[current]=tempArr[arrLeft];
                arrLeft++;
            }else{
                array[current]=tempArr[arrRight];
                arrRight++;
            }
            current++;
        }
        //剩余部分复制到目标数组
        //若是右边剩了则右边原本就在原来的数组中,故不用复制,若是左边剩余则将剩余部分复制到目标数组
        int remaining=middle-arrLeft;
        for(int i=0;i<=remaining;i++){
            array[current+i]=tempArr[arrLeft+i];
        }   
        return array;
    }
    public static int[] mergeSort(int []array,int low,int high){
        if(low<high){
            int middle=(low+high)/2;
            mergeSort(array,low,middle);
            mergeSort(array,middle+1,high);
            return merge(low,middle,high,array);

        }
        return array;
    }
    public static void main(String[] args) {
        //2,4,56,23,45,67,78,3,1
        int []array={0,1,2,7,45,8,21,81,-1,0,9,41,98,26,17,67,89,34,23,12,20};
        int []arr=MergeSort.mergeSort(array, 0, array.length-1);
        for(int i=0;i<array.length;i++){
            System.out.println(arr[i]);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为你提供归并排序Java代码示例。以下是一个简单的实现: ```java public class MergeSort { // 归并排序函数 public void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; // 递归地对左半部分进行归并排序 mergeSort(arr, left, mid); // 递归地对右半部分进行归并排序 mergeSort(arr, mid + 1, right); // 合并两个有序数组 merge(arr, left, mid, right); } } // 合并两个有序数组的函数 public void merge(int[] arr, int left, int mid, int right) { int n1 = mid - left + 1; int n2 = right - mid; // 创建临时数组 int[] L = new int[n1]; int[] R = new int[n2]; // 将数据复制到临时数组 for (int i = 0; i < n1; ++i) { L[i] = arr[left + i]; } for (int j = 0; j < n2; ++j) { R[j] = arr[mid + 1 + j]; } // 合并临时数组到原数组 int i = 0, j = 0; int k = left; while (i < n1 && j < n2) { if (L[i] <= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } // 处理剩余元素 while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } // 打印数组的函数 public void printArray(int[] arr) { int n = arr.length; for (int i = 0; i < n; ++i) { System.out.print(arr[i] + " "); } System.out.println(); } // 测试代码 public static void main(String[] args) { int[] arr = { 12, 11, 13, 5, 6, 7 }; MergeSort mergeSort = new MergeSort(); mergeSort.mergeSort(arr, 0, arr.length - 1); System.out.println("排序后的数组:"); mergeSort.printArray(arr); } } ``` 这段代码实现了归并排序算法。你可以将待排序的数组赋值给`arr`数组,然后创建一个`MergeSort`对象并调用`mergeSort`方法来进行排序。最后,通过调用`printArray`方法打印出排序后的数组。上述代码会输出`排序后的数组:5 6 7 11 12 13`。希望对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值