Witam, na zajęcia zaimplementowałem szereg algorytmów sortowania i trzy z nich mi odrzucono ponieważ "gdzieś jest błąd"
- Quicksort w wersji Lomuto i Hoare'a. Dla optymistycznej i średniej wersji ma O(nlogn) a dla pesymistycznej O(n^2) jednak wszystkie czasy wyszły mi podobnie.
Lomuto: 74.9s, 75,3s oraz 77.8s.
Hoare'a: 43.9s, 43.7s oraz 43.66s.
Są trzy tablice o wielkości N.
Rosnąca[1...N], Malejąca[1...N], Losowa[1...N].
I czas pesymistyczny jest rzędu takiego tak optymistyczny i średni więc gdzieś powinien być błąd w kodzie. Siedzę i siedzę w debugerze szukając anomalii lecz znaleźć nie mogę. Może ktoś zerknąć okiem?
int PartitionLomuto(int A[], int p, int r) {
int x = A[r],
i = p - 1,
temp;
for(int j = p; j <= r - 1; j++)
if(A[j] <= x) {
i++;
temp = A[i];
A[i] = A[j];
A[j] = temp;
}
temp = A[i + 1];
A[i + 1] = A[r];
A[r] = temp;
return i + 1;
}
void Lomuto(int A[], int p, int r) {
if(p < r) {
int q = PartitionLomuto(A, p, r);
Lomuto(A, p, q - 1);
Lomuto(A, q + 1, r);
}
}
int PartitionHoare(int A[], int p, int r) {
int x = A[p],
i = p,
j = r,
temp;
while(true) {
while(A[j] > x)
j--;
while(A[i] < x)
i++;
if(i < j) {
temp = A[i];
A[i] = A[j];
A[j] = temp;
i++;
j--;
}
else
return j;
}
}
void Hoare(int A[], int p, int r) {
if(p < r) {
int q = PartitionHoare(A, p, r);
Hoare(A, p, q);
Hoare(A, q + 1, r);
}
}
- No z Bubblesort to samo. Losowa sortuje się dłużej niż pesymistyczna. A nie powinna.
void BubbleSort(int A[], int size) {
bool swapped = true;
int j = 0, temp;
while(swapped) {
swapped = false;
j++;
for(int i = 0; i < size - j; i++)
if(A[i] > A[i + 1]) {
temp = A[i];
A[i] = A[i + 1];
A[i + 1] = temp;
swapped = true;
}
}
}