Sortowanie przez wstawianie (Insertion sort)
Transkrypt
Sortowanie przez wstawianie (Insertion sort)
Sortowanie przez wstawianie (Insertion sort) void InsertionSort( int a[], int n ) { int key, i; for( int KOSZT j = 1; j < n; j++ ) KROTNOŚĆ c1 n key = a[ j ]; c2 n-1 i = j - 1; c3 n-1 { for( ; i >= 0 && a[ i ] > key; i-- ) c4 a[ i + 1 ] = a[ i ]; c5 a[ i + 1 ] = key; c6 n-1 } } 1) Gdy pętla for lub while się kończy w zwykły sposób, sprawdzenie warunku jest wykonywane o 1 raz więcej niż treść pętli 2) tj - liczba sprawdzeń warunku wejścia do pętli Czas działania funkcji (sumujemy iloczyny kosztów i liczby wykonań) T(n)=c1*n+ (c2+c3+c6)(n-1)+c4 +c5 PRZYPADEK OPTYMISTYCZNY (tablica posortowana) Dla każdego j=2,3,...,n stwierdzamy, że a[ i ] > key dla i=j-1, zatem tj=1. T(n)= c1*n+ (c2+c3+c6+c4)(n-1) ∈ O(n) PRZYPADEK PESYMISTYCZNY (tablica posortowana w porządku odwrotnym) Musimy porównać każdy element A[j] z każdym elementem posortowanej podtablicy A[1...j1], zatem tj=j dla j=2,3,...n, ponadto T(n)=c1*n+ (c2+c3+c6)(n-1)+c4 +c5 , ∈ O(n2) PRZYPADEK ŚREDNI tj =j/2 (średnio połowa elementów jest mniejsza od klucza) T(n)=c1*n+ (c2+c3+c6)(n-1)+c4 + c5 ∈ O n2) .