机试指南——扩展排序(计数,归并,)

niboac

关注

阅读 54

2022-02-13

目录

线性排序——计数排序

to be continue…


逆序数对——归并排序

首先了解一下什么叫做逆序数对,抄一段百度

ok,现在我们的代码需求是求出一个数列的逆序数对数,不同于暴力求解的双遍历O(n^2)的时间复杂度,这里我们可以利用归并排序的一个特性很精妙地求解出逆序数。

#include <iostream>

using namespace std;

const int Max = 1000 + 10;

int arr[Max];
int temp[Max];

void Combine(int left, int middle, int right) {
    int i = left;
    int j = middle + 1;
    int k = left;
    while (i <= middle && j <= right) {
        if(arr[i] <= arr[j]){
            temp[k++] = arr[i++];
        } else{
            temp[k++] = arr[j++];
        }
    }
    while (i <= right){
        temp[k++] = arr[i++];
    }
    while (j <= right){
        temp[k++] = arr[j++];
    }
    for(k = left; k <= right; k++){
        arr[k] = temp[k];
    }
}

void MergeSort(int left, int right){
    if(left < right){
        int middle = left + (right - left) / 2;
        MergeSort(left, middle);
        MergeSort(middle + 1, right);
        Combine(left,middle,right);
    }
}

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }
    MergeSort(0, n - 1);
    for (int i = 0; i < n; i++) {
        printf("%d", arr[i]);
    }
    printf("\n");

    return 0;
}

精彩评论(0)

0 0 举报