Time complexity 为什么气泡排序的时间复杂性是#x27;s最佳情况为O(n)
我根据算法2.2一书中使用的方法,推导了气泡排序在最佳情况下的时间复杂度。但是答案是O(n^2) 这是我的推导,希望任何人都能帮我找出哪里错了: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])
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;
}
}
}
}