我必须解决以下问题。所以最初我有一个冒泡排序,现在我修改它以使其双向。以下是我的解决方案。
public void bubbleSort() {
int temp;
int out;
int outNew = 0;
int in;
for (out = nElems - 1; out > outNew; out--) {
for (in = 0; in < out; in++) {
if (a[in] > a[in + 1]) {
temp = a[in + 1];
a[in + 1] = a[in];
a[in] = temp;
}
}
for (int j = in - 1; j > outNew; j--) {
if (a[j] < a[j - 1]) {
temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
outNew++;
}
}
当我调用我的冒泡排序来对我创建的数组中的几个随机数进行排序时,似乎排序正常。我的问题是,对于所有开发人员而言,我的解决方案是否满足上面发布的问题以及我可以做些什么来使这个解决方案更有效(如果可能)。我很抱歉,如果这是一个小问题,我通常会在这里寻找提示和建议,而不是代码,因为它可以帮助我更好地学习。我感谢所有的答案,并对任何建议持开放态度。
答案 0 :(得分:1)
你的第一个内循环似乎效率低下,因为你的数组将在两端进行部分排序。在第一轮(一次递增索引,一次递减它)之后,第一个和最后一个元素已经是正确的,因此不需要从索引0开始(并且任务/练习需要btw)。
以下ASCII艺术演示了算法应该在具有9个元素的数组示例上操作的索引(包括使用in+1
和j-1
到达的索引; {{之间的所有索引应该考虑1}}:
|
但你的算法的作用是:
position: 0 1 2 3 4 5 6 7 8
------------------------------------------------------------
| -> |
| <- |
| -> |
| <- |
| -> |
| <- |
| -> |
| <- |
您必须修复第一个内部for循环的初始索引。
答案 1 :(得分:1)
简而言之,我认为你不能让我更有效并同时回答这个问题。它非常明确,你必须把你的物品拿到右边,直到你找到一个较小的物品,然后取出比你最后携带的物品略小的物品并将它抬起来。我不认为常规单向冒泡排序会带来任何性能提升,但如果您要将其设置为双向,那么这就是实现它的方法。
你怎么知道?好吧,因为没有性能增益/恶化,左 - 右;右代码和右 - &gt;左代码应该是完全对称的(因为它们在性能方面是相同的)。在你的情况下,我会说它看起来不错。
进一步思考,可能会有一些轻微的优化来获得双向,只是因为你得到一个你刚刚看过的项目,所以你知道你可以从它的初始位置向左移动,跳过右边的数组。但最终,它可以忽略不计,无论你如何分割,它仍然是O(n²)性能。