使用数字C ++对字符串数组进行排序

时间:2016-11-23 12:54:30

标签: c++ arrays sorting

我有解决这个问题的问题。 第一行的任务很简单我输入了多少个例子。 在第二行,我需要输入我要阅读的数字。 然后我们按空格分隔所有数字。 任务本身就是这样做,将字符串数组从小数字排序到最大数字。之后,如果输入偶数,我们打印中间数字-1,如果它们不均匀,我们只打印中间数字。

到目前为止,如果我使用完全相同的代码并使用long long,它可以完美地工作,但它仅限于19位数字,我想扩展程序,以便它可以使用更大的数字。

使用这种方式排序功能,当我尝试将16个元素从160到10排序时,它们全部搞砸了它从110开始然后在midle是160,所以一个,这绝对没有意义,使用5个数字或8任何问题都可以完美运行,使用更多数字失败。

#include <iostream>
#include <algorithm>
#include <string>

using namespace std;




int main() {
int examples;
cin >> examples;
for (size_t i = 0; i < examples; i++)
{
    long long unsigned int  n;
    cin >> n;
    string * numbers = new string[n];
    for (size_t i = 0; i < n; i++)
    {
        cin >> numbers[i];
    }

    sort(numbers, numbers + n);

    if (n % 2 == 0) {
        cout << numbers[n / 2 - 1];
    }
    else
        cout << numbers[n / 2];



}

system("pause");
return 0;
}

1 个答案:

答案 0 :(得分:2)

首先,如果使用operator new分配内存,则必须使用operator delete []释放它。

其次,当你对字符串而不是值进行排序时,它们就像字符串那样排序,这就是你的问题所在。你看,100按字母顺序小于2或20,这就是为什么它会更早出现。

这是您的程序提供的输出。检查此规则,您会发现我是对的。

10 100 110 120 130 140 150 160 20 30 40 50 60 70 80 90

第三,几乎不鼓励使用operator new。你有STL,你似乎在广泛使用它 - 为什么不用矢量?

第四,你不检查我们写入数字[i]的是否实际上是一个数字。想一想。

第五,因为N足够长(大于2 ^ sizeof(size_t)),你的问题永远不会因整数溢出而停止。

第六,你没有检查n == 0,如果输入它,你最终会得到内存访问冲突。

针对您的问题进行快速右键修复:

#include <iostream>
#include <algorithm>
#include <string>
#include <vector>

using namespace std;

int main() {
    int examples;
    cin >> examples;
    for (size_t i = 0; i < examples; i++)
    {
        size_t n;
        cin >> n;
        if (n <= 0)
            break;
        vector<string> numbers(n);
        for (size_t i = 0; i < n; i++)
            cin >> numbers[i];

        //here we add a predicate for string checking,
        //which evaluates the length of string
        //before using the usual operator<.

        sort(begin(numbers), end(numbers), [](const string& s1, const string& s2){
            if (s1.length() < s2.length())
                return true;
            if (s2.length() < s1.length())
                return false;
            else
                return (s1 < s2);
        });

        if (n % 2 == 0) {
            cout << numbers[n / 2 - 1];
        }
        else
            cout << numbers[n / 2];
    }

    system("pause");
    return 0;
}

但是,它存在许多问题:

  1. 检查数字[i]实际上是否为数字

  2. 我不确定 我写的谓词并没有错误 - 我只是想给你 关于它应该如何运作的想法。