Data structures 单for循环冒泡排序的时间复杂度

Data structures 单for循环冒泡排序的时间复杂度,data-structures,bubble-sort,Data Structures,Bubble Sort,我研究了冒泡排序是一种O(n^2)算法。但是我设计了一个算法,看起来像O(n)。以下是我的代码: void bubbleSort(int[] arr) { int counter = 1, i = 0; int N = arr.length-counter; for(i=0; i<N; ){ if(arr[i]>arr[i+1]){ int temp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = temp; } i

我研究了冒泡排序是一种O(n^2)算法。但是我设计了一个算法,看起来像O(n)。以下是我的代码:

void bubbleSort(int[] arr) {
int counter = 1, i = 0;
int N = arr.length-counter;
for(i=0; i<N; ){
  if(arr[i]>arr[i+1]){
    int temp = arr[i];
    arr[i] = arr[i+1];
    arr[i+1] = temp;
  }
  i++;
  if(i == N){
    N = arr.length - (++counter);
    i = 0;
  }
}
void bubbleSort(int[]arr){
int计数器=1,i=0;
int N=阵列长度计数器;
对于(i=0;iarr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=温度;
}
i++;
如果(i==N){
N=阵列长度-(++计数器);
i=0;
}
}
有一个for循环,当它等于N时设置计数器i。根据我的说法,循环为O(N),并重置N-1次。因此,它变成O(n)+O(n-1)=O(n)。
我说得对吗?如果不是,那么这段代码的复杂性应该是多少。

不,您不正确。拥有一个循环并不意味着它是
O(n)
。您必须考虑执行了多少步骤

i==N
时,将重新初始化循环。你说得对-循环被重新初始化
(n-1)
次。现在,每个时间循环执行
N
次的then值。所以不是
O(n)+O(n-1)
而是
O(n*(n-1))
最终导致
O(n^2)

例如—

at first pass, loop will be executed (N) times. then N will be re-initialized to (N-1)
at second pass, loop will be executed (N-1) times. then N will be re-initialized to (N-2)
...
...
this will go on in total of (n-1) times.
所以它将是-
O(N+(N-1)+(N-2)+…+1)
,它将被评估为
O(N^2)

出于实验目的,您可以全局初始化计数器。并检查程序执行的总步数的值,以检查实际发生的情况-

void bubbleSort(int[] arr) {
int counter = 1, i = 0;
int total = 0;
int N = arr.length-counter;
for(i=0; i<N; ){
  total++;
  if(arr[i]>arr[i+1]){
    int temp = arr[i];
    arr[i] = arr[i+1];
    arr[i+1] = temp;
  }
  i++;
  if(i == N){
    N = arr.length - (++counter);
    i = 0;
  }
}
printf(%d", total); // this will give you total number of steps executed. check for various value of n
void bubbleSort(int[]arr){
int计数器=1,i=0;
int-total=0;
int N=阵列长度计数器;
对于(i=0;iarr[i+1]){
int temp=arr[i];
arr[i]=arr[i+1];
arr[i+1]=温度;
}
i++;
如果(i==N){
N=阵列长度-(++计数器);
i=0;
}
}
printf(%d),total);//这将给出执行的步骤总数。检查n的各种值

您的循环正在外部循环内初始化n-1次,因此

循环将按以下方式执行


对于外循环的每次迭代,内循环为n-1次,即外循环的n次迭代*n-1次内循环的迭代=(n*n-1)=n2使其复杂性为O(n2)

答案在您自己的陈述中:

有一个for循环,当它等于N时,计数器i被设置。根据我的说法,循环是O(N),它重置了N-1次。因此,它变成了O(N)+O(N-1)=O(N)。我对吗?如果不对,这段代码的复杂度应该是多少

  • 只有一个循环。正确
  • 这个循环的时间复杂度是O(n)。正确
  • 循环重置n-1次。正确
  • 但计算是错误的
如果循环重置n-1次,复杂性将变为: O(n)+O(n-1)+O(n-2)+..+O(1),本质上就是O(n^2)