这两种算法按升序排序日期。这两种算法是否称为冒泡排序?
1)首先,它通过使用swap找到所有整个数组中的最小值并将其放在索引0中,依此类推。
或者其他的话 - >在每次迭代之后,它使用swap推送数组开头的最小值。
for (int i = 0; i != arrayEnd - 1; i++) {
for (j = i + 1; j != arrayEnd; j++) {
if (A[i] > A[j]) {
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
}
2)每次迭代一次后,它会使用swap推送数组末尾的最大值。
while (!isSorted) {
isSorted = true;
for (int i = 0; i < lastUnsorted; i++) { // lastUnsorted = arrayLength - 1;
if (A[i] > A[i + 1]) {
temp = A[i];
A[i] = A[i + 1];
A[i + 1] = temp;
isSorted = false;
}
}
lastUnsorted--;
}
它们都被称为冒泡排序?
答案 0 :(得分:3)
在这两种情况下,它都遵循bubblesort,但在第二种情况下,冒泡排序通过删除数组末尾的最大元素而变得高效。
现在,当数组有一个较长的最大元素尾部时,仍会进行大量不必要的迭代,比如你有k,k-1,...,1作为前k个元素,k + 1到之后依次为100000000。标准冒泡排序将通过(几乎)整个阵列k次。
但你可以尝试这个:
while(!isSorted){
isSorted = true;
int lastSwap = lastUnsorted;
for (int i = 0; i < lastSwap; i++) { // lastUnsorted = arrayLength - 1;
if (A[i] > A[i + 1]) {
temp = A[i];
A[i] = A[i + 1];
A[i + 1] = temp;
isSorted = false;
currentSwap = j;
}
}
lastUnsorted--;
lastSwap = currentSwap;
}
答案 1 :(得分:2)
是的 - 两者都是泡泡种类。 变体1)不是最优的 - 每种情况都是O(N ^ 2) 变体2)更好 - 内部循环每次迭代都会跳过一次比较,因为它知道一个元素是否在排序的位置。
答案 2 :(得分:0)
经典冒泡排序有O(n ^ 2)和Ω(n)渐近运行时。这是我的第二个变种。第一个变体更类似于选择排序O(n ^ 2)Ω(n ^ 2)但没有找到最小值。
简单地说我的第一个变体效率低于经典的选择排序,尽管它们非常相似。
我的答案是否定的。他们不是冒泡的。只有第二个是冒泡排序。