Data structures 单for循环冒泡排序的时间复杂度
我研究了冒泡排序是一种O(n^2)算法。但是我设计了一个算法,看起来像O(n)。以下是我的代码: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
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次。正确
- 但计算是错误的