有没有这种极端情况

Are there corner cases to this sort?

本文关键字:情况 有没有      更新时间:2023-10-16

我正在尝试回到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/

基本情况

让我们检查一下琐碎的情况:

  • array_size = 0 .外循环立即退出,没有任何变化,所以这是有效的。
  • array_size = 1 .内部循环立即退出,没有任何变化,因此这是有效的。

感应步进

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

array = 4, 2, 1, 3

现在让我们浏览一下内部循环。每当第 i 个元素较大时,将第 k 个元素与第 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

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

相关文章: