有没有这种极端情况
Are there corner cases to this sort?
我正在尝试回到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,因此尝试对较大的数组进行排序将不起作用,并且可能导致签名溢出,这是未定义的行为。
相关文章:
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有办法在不使用 getline() 的情况下从.csv文件中读取?
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 有没有办法在没有虚拟的情况下使用基类指针调用派生类函数
- 有没有办法在不重新启动或注销的情况下加载游标?
- 有没有办法在不使用命名空间 std 或前缀 std:: 的情况下引用 cout?
- 在C++中,有没有一种方法可以让我在不传递参数的情况下拥有一个函数
- 有没有一种方法可以在不设置精度的情况下设置小数位数
- 有没有一种方法可以在不复制数据的情况下从string_view创建字符串流
- 有没有办法在没有reinterpret_cast的情况下保存多种类型的指针?
- 有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
- 有没有办法在不使用任何迭代的情况下将字符的字母顺序排列
- 有没有办法缩短这种情况
- 有没有办法在不使用 set_buff() 的情况下从文件中读取并填充消息增益
- 有没有一种很好的方法来实现具有默认失败情况的条件类型?
- 有没有办法在不覆盖实际分配的情况下使用 vulkan 内部分配回调?
- 有没有办法在不使用循环的情况下非具体地引用映射中的每个值?C++
- 有没有这种极端情况
- 有没有办法在不重新实现的情况下从子类中标记父级的虚拟函数 final。