是否有这种极端情况?

时间:2019-06-13 08:57:32

标签: c++ sorting

我正在尝试重新使用c ++,并且已经做了一些练习,其中包括排序。我必须按降序对简单数组进行排序。据我所知,最简单的排序是这样的:

for ( int i = 0; i < array_size; i++ ) {

    for ( int k = 0; k < i; k++ ) {

        if ( array[i] > array[k] ) {

            int temp = array[i];
            array[i] = array[k];
            array[k] = temp;
        }
    }
}

它可以工作...但是我想知道是否有任何极端情况无法解决这个问题。我问是因为据我看,我找不到任何人使用它。我可以找到的大多数示例都与此类似:https://www.geeksforgeeks.org/bubble-sort/

2 个答案:

答案 0 :(得分:2)

基本案例

让我们检查一些琐碎的案例:

  • array_size = 0。外循环立即退出,并且没有任何变化,因此可以正常工作。
  • array_size = 1。内部循环立即退出,并且没有任何变化,因此可以正常工作。

归纳步骤

现在假设在外循环的某个迭代i上,元素0, 1, ..., i-1被排序。例如,让i = 3并考虑以下示例:

array = 4, 2, 1, 3

现在让我们遍历内部循环。每当第k个元素较大时,将第i个元素与第i个元素交换。

k = 0:  array = 4, 2, 1, 3
k = 1:  array = 4, 3, 1, 2
k = 2:  array = 4, 3, 2, 1

内部循环似乎正确地对数组元素0, 1, ..., i进行了排序。

因此,在迭代i结束时,数组元素0, 1, ..., i都已排序。


结论

最终迭代在i = array_size-1。执行此操作后,必须对所有数组元素0, 1, ..., array_size-1进行排序。但这就是整个array

答案 1 :(得分:0)

С++使用size_t作为足以容纳大小值的类型,而int变量可能不足。例如,在具有32位int的典型64位平台上,其最大值为2,147,483,647,因此尝试对较大的数组进行排序将不起作用,并可能导致有符号溢出,这是未定义的行为。