Time complexity 为什么气泡排序的时间复杂性是#x27;s最佳情况为O(n)

Time complexity 为什么气泡排序的时间复杂性是#x27;s最佳情况为O(n),time-complexity,bubble-sort,Time Complexity,Bubble Sort,我根据算法2.2一书中使用的方法,推导了气泡排序在最佳情况下的时间复杂度。但是答案是O(n^2) 这是我的推导,希望任何人都能帮我找出哪里错了: public void bubbleSort(int arr[]) { for(int i = 0, len = arr.length; i < len - 1; i++) { for(int j = 0; j < len - i - 1; j++) { if(arr[j + 1] < arr[j])

我根据算法2.2一书中使用的方法,推导了气泡排序在最佳情况下的时间复杂度。但是答案是O(n^2)

这是我的推导,希望任何人都能帮我找出哪里错了:

public void bubbleSort(int arr[]) {
for(int i = 0, len = arr.length; i < len - 1; i++) {
    for(int j = 0; j < len - i - 1; j++) {
        if(arr[j + 1] < arr[j])
            swap(arr, j, j + 1);
    }
}
public void bubbleSort(int-arr[]){
for(int i=0,len=arr.length;i
}

语句的成本时间
i=0,len=arr.length c1 1
i
T(n)=c1+c2n+c3(n-1)+c4(n-1)+c5t5+c6t6+c7t7+c8t8 =c1+c2n+c3(n-1)+c4(n-1)+c5[t1(i=0)+t1(i=1)+…+t1(i=n-2)]+c6[t2(i=0)+t2(i=1)+…+t2(i=n-2)]+c7[t3(i=0)+t3(i=1)+…+t3(i=n-2)]+c8[t4(i=0)+t4(i=1)+t4(i=2)]

在其最佳转换中,排序前序列已为正。那么t8应该是0

T(n)=c1+c2n+c3(n-1)+c4(n-1)+c5[t1(i=0)+t1(i=1)+…+t1(i=n-2)]+c6[t2(i=0)+t2(i=1)+…+t2(i=n-2)]+c7[t3(i=0)+t3(i=1)+…+t3(i=n-2]

时间复杂度是O(n^2)

您的实现

public void bubbleSort(int arr[]) {
    for(int i = 0, len = arr.length; i < len - 1; i++) {
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j])
                swap(arr, j, j + 1);
        }
    }
}
public void bubbleSort(int-arr[]){
for(int i=0,len=arr.length;i
无法控制内部循环中是否有交换,如果没有交换,则无法控制外部循环的中断

该控件使得最好的情况(已经排序的数组)可能是O(n),因为在第一次运行时,内部循环中没有交换

public void bubbleSort(int arr[]) {
    boolean swapped = true;
    for(int i = 0, len = arr.length; swapped && i < len - 1; i++) {
        swapped = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                swapped = true;
            }
        }
    }
}
public void bubbleSort(int-arr[]){
布尔交换=真;
for(int i=0,len=arr.length;交换&&i
我不知道你在数什么。一般来说,在讨论比较排序算法时,应该计算所做比较的数量。冒泡排序被认为是这样的。在这种情况下,您提出的算法是O(n^2)

如果你计算一下掉期的数量,它是O(1),或者甚至可以说是O(0)。然而,很少有人能像这样分析泡沫


然而,你们可以很容易地改进Bubble,在最佳情况下得到O(N)。例如,通过引入标志
交换
。如果在
的内部
结尾处为false,则可以完成。在最好的情况下,它将复杂性降低到O(N)(一个内部循环)。在公平均匀分布的情况下,它将预期或平均复杂性降低到O(N^2/2)。。。但请仔细检查一下,我可能错了。这里没有计算。

冒泡排序的最佳情况是当元素已经排序时

通常的实现给出了最佳、平均和最坏情况下的O(n^2)时间复杂度

我们可以通过在每次迭代中检查数组是否已排序(交换将指示未排序的数组)来修改冒泡排序

一旦发现数组被排序(如果没有发生交换),控制从循环中退出,或者循环继续执行,直到长度为1


插入排序也是如此

不过,在分析算法时,最好不要假设除了基本实现之外的任何东西。在这种情况下,我们必须假设冒泡排序不会被实现为一个优化版本,如果它从不交换任何值,就会中断循环。@AleksandrH True。但对于冒泡排序,至少有一些作者(例如)在定义中包含了检查。
public void bubbleSort(int arr[]) {
    boolean swapped = true;
    for(int i = 0, len = arr.length; swapped && i < len - 1; i++) {
        swapped = false;
        for(int j = 0; j < len - i - 1; j++) {
            if(arr[j + 1] < arr[j]) {
                swap(arr, j, j + 1);
                swapped = true;
            }
        }
    }
}