3

我有一个编写双向冒泡排序的家庭作业。有人可以看看我的逻辑是否正确。我不想要代码,因为我想自己弄清楚。我只想对我的理解进行逻辑检查。

据我了解双向冒泡排序您实现了 2 个循环,一个从列表中的位置 1 开始并执行正常的冒泡排序。当第一个 for 循环结束时,第二个 for 循环执行反向工作。我只是不完全理解每个循环的终止条件是什么。

for 循环条件会如下所示吗?

循环 1 -for(i = 0; i < Count -i; i++)

循环 2 -for(j = Count - i; j > i; j--)

在每个循环中,将指定交换条件。

谢谢

4

2 回答 2

3

“经典”冒泡排序在每次迭代时都会遍历整个数组,因此循环应该是

for(i = 0; i < Count - 1; i++)

for(j = Count - 1; j > 0; j--)

两个循环都跳过一个索引:第一个循环跳过最后一个索引,而第二个循环跳过第一个索引。这样您的代码就可以安全地与data[i]data[i+1]进行data[j]比较data[j-1]

编辑优化”冒泡排序在第 - 次迭代中跳过初始k元素。k由于冒泡排序是双向的,因此您将能够跳过初始元素k和尾部k元素,如下所示:

 int k = 0;
 do { // The outer loop
     ...
     for(int i = k; i < Count - k - 1; i++)
         ...
     for(int j = Count - k - 1; j > k ; j--)
         ...
     k++;
} while (<there were swaps>);
于 2013-04-05T08:39:06.593 回答
2

双向冒泡排序是这样工作的:

而不是每次都从底部到顶部传递列表(冒泡排序),而是从底部开始一次,然后从列表顶部开始。

维基百科文章在解释它方面做得更好:

http://en.wikipedia.org/wiki/Cocktail_sort

- 富有的

于 2013-04-05T08:43:17.037 回答