zoukankan      html  css  js  c++  java
  • 归并排序:逆序对问题

    归并排序:逆序对问题

    在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对

    代码

    #include <stdio.h>
    
    int helperArr[10];
    
    void Merge(int arr[], int l, int mid, int r)
    {
        int i = l;
        int p1 = l;
        int p2 = mid + 1;
        while (p1 <= mid && p2 <= r) {
            if (arr[p1] > arr[p2]) {
                for (int j = p2; j <= r; ++j) {
                    printf("[%d, %d] ", arr[p1], arr[j]);
                }
            }
            helperArr[i++] = arr[p1] > arr[p2] ? arr[p1++] : arr[p2++];
        }
        while (p1 <= mid) {
            helperArr[i++] = arr[p1++];
        }
        while (p2 <= r) {
            helperArr[i++] = arr[p2++];
        }
    
        for (; l <= r; l++) {
            arr[l] = helperArr[l];
        }
    }
    
    void MergeSort(int arr[], int l, int r)
    {
        if (l == r) {
            return;
        }
        int mid = l + ((r - l) >> 1); // =(l+r)/2 因为l+r有可能会溢出,所以改成减法的方式
        MergeSort(arr, l, mid);
        MergeSort(arr, mid + 1, r);
        Merge(arr, l, mid, r);
    }
    
    void MergeInversion(int arr[], int size)
    {
        if (arr == NULL || size < 2) {
            return;
        }
        return MergeSort(arr, 0, size - 1);
    }
    
    void PrintArr(int arr[], int size)
    {
        printf("
    ");
        for (int i = 0; i < size; ++i) {
            printf("%d ", arr[i]);
        }
        printf("
    ");
    }
    
    int main()
    {
        int arr[10] = {6, 0, 5, 3, 15, 21, 13, 9, 12, 8};
        PrintArr(arr, 10);
        MergeInversion(arr, 10);
        PrintArr(arr, 10);
        return 0;
    }
    
  • 相关阅读:
    final关键字
    this and super
    java 内存分析之static
    java 内存分析之this
    java 内存分析之方法返回值二
    java 内存分析之方法返回值及匿名对象一
    java 内存分析之构造方法执行过程
    java 内存分析之堆栈空间
    java jvm概述及工作过程中的内存管理
    java 编译器
  • 原文地址:https://www.cnblogs.com/causewang/p/12064482.html
Copyright © 2011-2022 走看看