C 哪一种是气泡型的,还是两者都是?

C 哪一种是气泡型的,还是两者都是?,c,sorting,C,Sorting,这两种算法按升序对日期进行排序。这两种排序算法称为冒泡排序吗 1) 首先,它使用swap从整个数组中找到最小的,并将其放入索引0中,依此类推 或者换句话说-->在每次迭代一次后,它使用交换在数组开始处推送最小值 for (int i = 0; i != arrayEnd - 1; i++) { for (j = i + 1; j != arrayEnd; j++) { if (A[i] > A[j]) { temp = A[i];

这两种算法按升序对日期进行排序。这两种排序算法称为冒泡排序吗

1) 首先,它使用swap从整个数组中找到最小的,并将其放入索引0中,依此类推

或者换句话说-->在每次迭代一次后,它使用交换在数组开始处推送最小值

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;
        }
    }
}
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--; 
}
2) 在每次迭代一次之后,它使用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;
        }
    }
}
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--; 
}
while(!isSorted){
isSorted=true;
对于(int i=0;iA[i+1]){
温度=A[i];
A[i]=A[i+1];
A[i+1]=温度;
isSorted=假;
}
}
最后未排序--;
}

它们都称为冒泡排序?

是-都是冒泡排序的变体。 变量1)不是最优的-每种情况都是O(N^2)
变量2)更好-内循环每次迭代都会跳过一次比较,因为它知道一个元素是否在排序位置。

在这两种情况下,它都遵循bubblesort,但在第二种情况下,通过删除数组末尾的最大元素,冒泡排序变得有效

现在,当数组有一个最大元素的长排序尾部时,这仍然会进行很多不必要的迭代,比如说,第一个k元素是k,k-1,…,1,然后是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; 
    }
while(!isSorted){
isSorted=true;
int lastSwap=最后未排序;
对于(int i=0;iA[i+1]){
温度=A[i];
A[i]=A[i+1];
A[i+1]=温度;
isSorted=假;
currentSwap=j;
}
}
最后未排序--;
lastSwap=currentSwap;
}

经典的冒泡排序有O(n^2)和Ω(n)渐近运行时间。这是我的第二个变种。第一个变量更类似于选择排序O(n^2)Ω(n^2),但没有找到最小值

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


我的答案是否定的。它们并非都是泡沫型的。第二种是气泡排序

从理论上讲,冒泡排序的最大元素在每次迭代后都会像冒泡一样上升到最后。算法有一个名字,最小的元素从一开始就像岩石一样下沉,但我似乎记不起来了。无论哪种方式,它们都是相同的算法。对冒泡排序(一个元素冒泡到“排序”的一端)最乐观的解释是由这两种算法完成的。但是,实际值会比较相邻元素。此外,您的第二个实现包括交换检测,这是一种提供提前退出选项的优化。O(n)的最佳情况发生在一个已经排序的序列上,而第一个实现仍然是O(n^2)。变量1)但是外循环每次迭代都会跳过一次比较,因为在1次迭代后它设置了一个[0]并且不再看那里(还有内循环),在2次迭代后它设置了一个[1]并且不再看那里(还有内环)等等。我认为它们在这个意义上是相等的。或者我错了?我认为变量1)和2)在效率意义上是相等的。“在第二种情况下,冒泡排序通过删除数组末尾的最大元素而变得高效”,而在第一种情况下,冒泡排序通过删除数组开头的最小元素而变得高效。我试着在两种变体中使用swapCounter来测试自己,在这两种情况下,我得到了相同的交换次数。