Loading

算法基础课_基础算法_归并排序

归并排序的基本模板

 public static void merge_sort(int[] arr, int l, int r){
        if(l >= r) return ;
        int mid = l + r >> 1;
        merge_sort(arr,l,mid);
        merge_sort(arr,mid+1, r);
        int[] tmp = new int[r-l+1];
        int i = l;
        int j = mid+1;
        int k = 0;
        while(i <= mid && j <= r){
            if(arr[i] < arr[j]) tmp[k++] = arr[i++];
            else tmp[k++] = arr[j++];
        }
        while (i <= mid) tmp[k++] = arr[i++];
        while (j <= r) tmp[k++] = arr[j++];
        for(i = l, j = 0 ; i <= r; i++, j++){
            arr[i] = tmp[j];
        }
    }

AcWing787

package AC.base.chapter1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class AcWing787 {
    //归并排序
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //1. 输入
        int n = Integer.parseInt(br.readLine());
        String[] str = br.readLine().split(" ");
        int[] nums = new int[n];
        for(int i=0;i<n;i++){
            nums[i] = Integer.parseInt(str[i]);
        }
        //2. 调用并归排序算法
        merge_sort(nums, 0, n-1);
        for(int i=0;i<n;i++){
            System.out.print(nums[i]+" ");
        }
    }
    public static void merge_sort(int[] arr, int l, int r){
        if(l >= r) return ;
        int mid = l + r >> 1;
        merge_sort(arr,l,mid);
        merge_sort(arr,mid+1, r);
        int[] tmp = new int[r-l+1];
        int i = l;
        int j = mid+1;
        int k = 0;
        while(i <= mid && j <= r){
            if(arr[i] < arr[j]) tmp[k++] = arr[i++];
            else tmp[k++] = arr[j++];
        }
        while (i <= mid) tmp[k++] = arr[i++];
        while (j <= r) tmp[k++] = arr[j++];
        for(i = l, j = 0 ; i <= r; i++, j++){
            arr[i] = tmp[j];
        }
    }
}

AcWing788 逆序对的数量

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.valueOf(br.readLine());
        String[] str = br.readLine().split(" ");
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.valueOf(str[i]);
            
        }
        long ans = merge_sort(arr,0,arr.length-1);
        System.out.println(ans);
    }
    public static long merge_sort(int[] arr, int l, int r){
        if(l >= r) return 0;
        int mid = l + r >> 1;
        long res = 0;
        res += merge_sort(arr,l,mid);
        res += merge_sort(arr,mid+1,r);
        int i = l;
        int j = mid+1;
        int k = 0;
        int[] tmp = new int[r - l + 1];
        while (i <= mid && j <= r){
            if(arr[i] <= arr[j]){
                tmp[k++] = arr[i++];
            }else{
                tmp[k++] = arr[j++];
                res += mid - i + 1;
            }
        }
        while (i <= mid) tmp[k++] = arr[i++];
        while (j <= r) tmp[k++] = arr[j++];
        for(i = l, j = 0; i <= r ; i++, j++){
            arr[i] = tmp[j];
        }
        return res;
    }
}
posted @ 2021-04-26 21:06  想用包子换论文  阅读(41)  评论(0编辑  收藏  举报