for (int front = 1; front < intArray.length; front++)
{
for (int i = 0; i < intArray.length - front; i++)
{
if (intArray[i] > intArray[i + 1])
{
int temp = intArray[i];
intArray[i] = intArray[i + 1];
intArray[i + 1] = temp;
}
}
}
La boucle interne est itérative: n + (n-1) + (n-2) + (n-3) + ... + 1 fois.
La boucle externe est itérative: n fois.
Vous obtenez donc n * (la somme des nombres 1 à n)
N'est-ce pas n * (n * (n + 1)/2) = n * ((n ^ 2) + n/2)
Lequel serait (n ^ 3) + (n ^ 2)/2 = O (n ^ 3)?
Je suis certain que je fais ça mal. Pourquoi pas O (n ^ 3)?
Vous avez raison de dire que la boucle externe itère n fois et que la boucle interne itère également n fois, mais vous comptez deux fois le travail. Si vous comptez le travail total effectué en additionnant le travail effectué à chaque itération de la boucle de niveau supérieur, vous obtenez que la première itération fonctionne n, la seconde n - 1, la troisième n - 2, etc., puisque la ième l'itération de la boucle de niveau supérieur a la boucle intérieure faisant n - i
travail.
Alternativement, vous pouvez compter le travail effectué en multipliant la quantité de travail effectuée par la boucle interne multipliée par le nombre total d'exécutions de cette boucle. La boucle interne fonctionne O(n) à chaque itération, et la boucle externe fonctionne pour O(n) itérations, donc le travail total est O ( n2).
Vous faites une erreur en essayant de combiner ces deux stratégies. Il est vrai que la boucle externe n fonctionne la première fois, puis n - 1, puis n - 2, etc. Cependant, vous ne multipliez pas ce travail par n pour obtenir le total. Cela compterait chaque fois n itérations. Au lieu de cela, vous pouvez simplement les additionner.
J'espère que cela t'aides!
Votre boucle intérieure itère, EN TOTAL, comme vous l'avez dit n + (n-1) + (n-2) + (n-3) + ... + 1 fois. Il s'agit donc de O (n + (n-1) + (n-2) + (n-3) + ... + 1) = O (n (n + 1)/2) = O (n ^ 2)
La boucle interne itère n fois (dans le pire des cas):
for(int i = front; i < intArray.length; i++)
La boucle externe itère n fois:
for(int front = 0; front < intArray.length; front++)
Par conséquent O (n ^ 2)
Comment vous calculez essentiellement N ...
Chaque boucle * N
Donc, vous commencez à ajouter des nombres à votre première boucle maintenant que vous avez N + 1, vous continuez et vous obtenez finalement N * N ou N ^ 2 pour le temps plus un certain nombre. Retirer le nombre car il est généralement insignifiant par rapport à N.
À peu près N est une représentation de tous les éléments de la boucle, comme 1,2,3 ... N. Il s'agit donc simplement de représenter un nombre et non le nombre de fois qu'une boucle, boucle.
k=1(sigma k)n = n(n+1)/2
because:
s = 1 + 2 + ... + (n-1) + n
s = n + (n-1) + ... + 2 + 1
+)
===================================
2s = n*(n+1)
s = n(n+1)/2
in bubble sort,
(n-1) + (n-2) + ... + 1 + 0 times compares
which means, k=0(sigma k)n-1
, k=0(sigma k)n-1 equals [k=1(sigma k)n] - n
therefore, n(n+1)/2 - n = n(n-1)/2
which is 1/2(n^2-n) => O(1/2(n^2-n))
in big O notation, we remove constant, so
O(n^2-n)
n^2 is larger than n
O(n^2)
Ceci est une autre version pour accélérer le tri des bulles, lorsque nous utilisons juste une variable swapped pour terminer la première boucle for tôt. Vous pouvez gagner en complexité temporelle.
#include <stdio.h>
#include <stdbool.h>
#define MAX 10
int list[MAX] = {1,8,4,6,0,3,5,2,7,9};
void display(){
int i;
printf("[");
for(i = 0; i < MAX; i++){
printf("%d ",list[i]);
}
printf("]\n");
}
void bubbleSort() {
int temp;
int i,j;
bool swapped = false;
// 1st loop
for(i = 0; i < MAX-1; i++) {
swapped = false;
// 2nd loop
for(j = 0; j < MAX-1-i; j++) {
printf(" Compare: [ %d, %d ] ", list[j],list[j+1]);
if(list[j] > list[j+1]) {
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
swapped = true;
}
}
if(!swapped) {
break;
}
printf("Loop number %d#: ",(i+1));
display();
}
}
main(){
printf("Before: ");
display();
printf("\n");
bubbleSort();
printf("\nAfter: ");
display();
}