c++ 为什么排序函数在输入100次时中断[已关闭]

zi8p0yeb  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(106)

**已关闭。**此问题不符合Stack Overflow guidelines。当前不接受答案。

这个问题似乎与help center中定义的范围内的编程无关。
昨天关门了。
Improve this question
所以我编写了下面的函数来对一组整数进行降序排序:

int* sort(int *a, int size)
{
    for (int j = 0; j < size;)
    {
        for (int i = j; i <= size;)
        {
            if (a[i] <= a[j]) i++;
            else if (a[i] > a[j])
            {
                int temp;
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
                break;
            }
        }
        j++;
    }
    for (int i = 0; i < (size - 1);)
    {
        if (a[i] > a[i+1]) i++;
        else 
        {
            sort(a, size);
        }
        if (i == size) return a;
    }    
}

只要size小于100,它就能正常工作。如果size为100,它会有些中断,但从size = 101开始,它就根本不给予输出。
当我以随机顺序使用数字1到100作为输入时,它会给出以下输出:

size = 100
array not sorted 79 24 85 28 26 3 6 38 49 7 95 43 82 96 73 75 56 67 44 97 52 80 69 83 66 30 87 54 41 31 32 12 1 15 92 57 25 18 10 19 86 55 89 34 70 2 9 46 37 21 77 53 17 84 11 68 91 48 29 13 71 72 27 76 63 94 5 50 62 39 16 35 81 99 14 98 58 61 100 60 4 47 88 93 74 59 65 42 20 23 8 40 33 78 51 22 36 64 90 45
array yes sorted 14554880 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 
54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2

所以在100之前有一个很长的数字,最后少了1。
然而,当我从输入列表中取出数字22时,输出如下:

size = 99
array not sorted 79 24 85 28 26 3 6 38 49 7 95 43 82 96 73 75 56 67 44 97 52 80 69 83 66 30 87 54 41 31 32 12 1 15 92 57 25 18 10 19 86 55 89 34 70 2 9 46 37 21 77 53 17 84 11 68 91 48 29 13 71 72 27 76 63 94 5 50 62 39 16 35 81 99 14 98 58 61 100 60 4 47 88 93 74 59 65 42 20 23 8 40 33 78 51 36 64 90 45 
array yes sorted 100 99 98 97 96 95 94 93 92 91 90 89 88 87 86 85 84 83 82 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 65 64 63 62 61 60 59 58 57 56 55 54 53 52 
51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

这些数字从100到1排列得很完美,只是没有22。
这是btw的主要函数(在这个数组中仍然有数字22):

int main() 
{
    int a[] = {79, 24, 85, 28, 26, 3, 6, 38, 49, 7, 95, 43, 82, 96, 73, 75, 56, 67, 44, 97, 52, 80, 69, 
    83, 66, 30, 87, 54, 41, 31, 32, 12, 1, 15, 92, 57, 25, 18, 10, 19, 86, 55, 89, 34, 70, 2, 9, 46, 37, 
    21, 77, 53, 17, 84, 11, 68, 91, 48, 29, 13, 71, 72, 27, 76, 63, 94, 5, 50, 62, 39, 16, 35, 81, 99, 14, 
    98, 58, 61, 100, 60, 4, 47, 88, 93, 74, 59, 65, 42, 20, 23, 8, 40, 33, 78, 51, 22, 36, 64, 90, 45};
    int size = sizeof(a)/sizeof(a[0]);
    cout << "size = " << size << endl;
    cout << "array not sorted "; for (int k = 0; k < size; k++) cout << a[k] << " "; cout << endl;
    sort (a, size);
    cout << "array yes sorted "; for (int k = 0; k < size; k++) cout << a[k] << " "; cout << endl;
}

所以我的问题是问题出在哪里?为什么我的函数只能处理100个数字?

ltskdhd1

ltskdhd11#

你似乎把所有的东西都写得很正确,然后出于某种原因添加了一些代码使它出错...
如果我用你的sort函数,删除嵌套循环中的break;,然后用递归删除整个最后一个循环,它工作得很好,换句话说,你的函数需要最后一个循环(没有嵌套的那个)因为你 * 错误地 * 决定在中间打破嵌套循环。
需要说明的是,我实际上只是从代码中删除了一些行(并纠正了我认为是您最初的bug)。

int* sort(int* a, int size)
{
    for (int j = 0; j < size;)
    {
        for (int i = j; i < size;)
        {
            if (a[i] <= a[j]) i++;
            else if (a[i] > a[j])
            {
                int temp;
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
        j++;
    }
    return a;
}

有一些额外的调整(见上面的评论,包括我的+一些更多):

void exchangeSort(int* a, int size)
{
    for (int j = 0; j < size; ++j) {
        for (int i = j + 1; i < size; ++i) {
            if (a[i] > a[j]) {
                int temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
        // When reaching here, a[j] >= a[i] for all i > j
    }
    // When reaching here, the above property is true for all indexes of a
    // => the array is sorted
}

今后,请记住:

  • 你得读一下解雇证明。

从索引ij一定会在某个点到达size的意义上说,你的情况是微不足道的;另一方面,正因为你的情况是微不足道的,你没有好的理由把i++j++写在for之外(在i++的情况下,写在if之内)。

  • 根据我与其他编码人员合作的经验,我建议您写下您的算法是做什么的。

我通过添加注解所做的是传达这样一个意图,即每个循环都保证一些属性在循环结束时为真(见第一个注解),这意味着在函数结束时,我到达了我想在函数中编码的后置条件。
如果你是一个初学者程序员,它可能是非常有用的,你打破了事情的方式,以及关于它了。

相关问题