合并排序:超过时间限制

时间:2019-06-14 15:11:57

标签: c++14 mergesort

为什么使用合并排序算法在排序数组中出现time limit exceeded错误?我的代码有什么问题?我输入了9个元素。

输入:4 2 1 8 5 9 6 7 0

输出:Time limit exceeded

#include <bits/stdc++.h>

using namespace std;
int a[100];

void merge(int a[], int l, int r, int m) {
    int t[r - l + 1];
    int i = l, j = m + 1, k = 0;
    while (i <= m && j <= r) {
        if (a[i] < a[j])
            t[k++] = a[i++];
        else
            t[k++] = a[j++];
    }
    while (i <= m)
        t[k++] = a[i++];
    while (j <= r)
        t[k++] = a[j++];
    for (int i = l; i <= r; i++)
        a[i] = t[i - l];
}

void msort(int a[], int l, int r) {
    if (l > r)
        return;

    int m = (r + l) / 2;
    msort(a, l, m);
    msort(a, m + 1, r);
    merge(a, l, r, m);
}

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    msort(a, 0, n - 1);
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些问题:

  • msort()中终止的测试是不正确的:如果切片中的元素不超过一个,则应停止。您目前永远在1个元素的切片上循环播放。

    if (l >= r) return;
    
  • 您应该在main()中测试是否从用户读取的元素数量n不大于100,即全局数组a的大小您可以在其中读取要排序的元素。您应该改为使用具有适当大小的本地数组,或者从堆中分配该数组。 t中的临时数组merge()可能也太大,无法自动分配。分配一次临时空间并递归传递它会更有效。

还要注意,在C和C ++中习惯于用第一个元素的索引和最后一个元素后的元素索引来指定数组切片。这样可以简化代码,并允许使用空数组,并避免了无符号索引类型的特殊情况。

这是使用此方法的修改版本:

#include <bits/stdc++.h>

using namespace std;

void merge(int a[], int l, int r, int m, int t[]) {
    int i = l, j = m, k = 0;
    while (i < m && j < r) {
        if (a[i] < a[j])
            t[k++] = a[i++];
        else
            t[k++] = a[j++];
    }
    while (i < m)
        t[k++] = a[i++];
    while (j < r)
        t[k++] = a[j++];
    for (int i = l; i < r; i++)
        a[i] = t[i - l];
}

void msort(int a[], int l, int r, int t[]) {
    if (r - l > 1) {
        int m = l + (r - l) / 2;
        msort(a, l, m, t);
        msort(a, m, r, t);
        merge(a, l, r, m, t);
    }
}

void msort(int a[], int n) {
    if (n > 1) {
        int *t = new int[n];
        msort(a, 0, n, t);
        delete[] t;
    }
}

int main() {
    int n;

    cin >> n;
    if (n <= 0)
        return 1;
    int *a = new int[n];
    for (int i = 0; i < n; i++)
        cin >> a[i];
    msort(a, n);
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    delete[] a;
    return 0;
}