其中哪一个是冒泡排序还是它们都是?

时间:2017-02-11 16:54:36

标签: c sorting

这两种算法按升序排序日期。这两种算法是否称为冒泡排序?

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--; 
}

它们都被称为冒泡排序?

3 个答案:

答案 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)但没有找到最小值。

简单地说我的第一个变体效率低于经典的选择排序,尽管它们非常相似。

我的答案是否定的。他们不是冒泡的。只有第二个是冒泡排序。