您的位置:首页 > 其它

求逆序对数的一种时间复杂度为nlgn的算法

2013-03-05 19:14 381 查看
今天做《算法导论》习题,求解逆序对,更改分治排序法,写出求解逆序对的算法。时间复杂度为nlgn

/************************************************************
 * count_inverse.c                                          *
 * To count the inverse number.                             *
 ************************************************************/

#include <stdio.h>
#define N 10

int count = 0;
void merge_inverse(int numbers[], int p, int q, int r, int *num);
void merge_and_count(int numbers[], int p, int r);

int main(void)
{
    int numbers
, i;
    printf("Please input %d integers:", N);

    for (i = 0; i < N; i++)
        scanf("%d", &numbers[i]);

    merge_and_count(numbers, 0, N);

    printf("The count of inverse is: %d\n", count);

    return 0;
}

void merge_and_count(int numbers[], int p, int r)
{
    if (p < r)
    {
        int q = (p + r) / 2;
        merge_and_count(numbers, p, q);
        merge_and_count(numbers, q + 1, r);
        merge_inverse(numbers, p, q, r, &count);
    }
}

void merge_inverse(int numbers[], int p, int q, int r, int *num)
{
    int i, j, k;
    int l_n = q - p + 1;
    int r_n = r - q;
    int Left[l_n], Right[r_n];
    for (i = 0; i < l_n; i++)
        Left[i] = numbers[p + i];
    for (i = 0; i < r_n; i++)
        Right[i] = numbers[q + 1 + i];

    for (i = j = 0, k = p; i < l_n || j < r_n; )
    {
        if (i >= l_n)
            numbers[k++] = Right[j++];
        else if(j >= r_n)
            numbers[k++] = Left[i++];
        else if(Left[i] <= Right[j])
            numbers[k++] = Left[i++];
        else
        {
            numbers[k++] = Right[j++];
            *num += l_n - i;
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐