我正在尝试重新使用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/
答案 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,因此尝试对较大的数组进行排序将不起作用,并可能导致有符号溢出,这是未定义的行为。