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)
.