是否只有一种方法可以实现气泡排序算法
Is there only one way to implement a bubble sort algorithm?
我试图在不在线查看任何伪代码的情况下实现自己的气泡排序算法,但现在我已经成功做到了,我的代码看起来与我在网上看到的示例非常不同。它们都涉及处理 true 或 false 的交换变量。我的实现根本不包括这一点,所以我没有进行气泡排序吗?
这是我在网上看到的一个例子:
for i = 1:n,
swapped = false
for j = n:i+1,
if a[j] < a[j-1],
swap a[j,j-1]
swapped = true
→ invariant: a[1..i] in final position
break if not swapped
结束
这是我的实现:
void BubbleSort(int* a, int size)
{
while (!arraySorted(a, size))
{
int i = 0;
while (i < (size-1))
{
if (a[i] < a[i+1])
{
i++;
}
else
{
int tmp = 0;
tmp = a[i+1];
a[i+1] = a[i];
a[i] = tmp;
i++;
}
}
}
}
它做同样的工作,但它做的不同吗?
正如一些人指出的那样,没有标志的版本可以工作,但速度非常慢。
但是,如果您采用原始版本并扔掉标志(连同break
),它仍然可以工作。从您方便地发布的不变量中很容易看出。
没有中断的版本具有与中断大致相同的最坏情况性能(最坏情况是按相反顺序排序的数组)。如果您想要一个保证在预定义时间内完成的算法,它比原始算法更好。
维基百科描述了优化气泡排序的另一个想法,其中包括扔掉break
。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 如何在C++中实现气泡排序?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 气泡阵列在C 实现中排序
- C 中的气泡排序实现
- 如何在气泡排序中为字符串和双精度实现异常处理程序
- 是否只有一种方法可以实现气泡排序算法
- 如何在 MFC 上实现语音气泡
- 实现算法(气泡排序)来组织阵列