Hej, próbuję w celach doświadczalnych zrealizować Hybrid Sort na bazie Merge Sort + Insertion Sort. Chcę uruchomić Insertion Sort dla ostatnich 10 elementów w tablicy, niestety algorytm nie działa prawidłowo. Można prosić o pomoc?
void insertionSort(int* table, int start, int end)
{
int temp, i, j;
// Zaczynamy pętlę od wartości, która nas interesuje
// Kończymy ją na ostatniej wartości w tablicy
for (i = start; i < end; i++)
{
temp = table[i];
for (j = i - 1; j >= 0 && table[j] > temp; j--)
{
table[j + 1] = table[j];
}
table[j + 1] = temp;
}
}
void hybridSort(int* table, int H1, int H2)
{
int H;
if (H1 < H2)
{
H = (H1 + H2) / 2;
// Jeśli pozostała ilość elementów odjęta od całości
// elementów w tablicy <= 10, to wykonaj insertSort
if (H2 - H1 <= 10)
{
insertionSort(table, H1, H2);
}
else
{
hybridSort(table, H1, H);
hybridSort(table, H + 1, H2);
}
hybrid(table, H1, H2, H);
}
return;
}
// int* table, int left, int right, int middle
void hybrid(int* table, int H1, int H2, int H)
{
int midTable[100005];
int left, right, middle;
left = H1;
middle = H1;
right = H + 1;
// Wykonuj się tak długo aż nie skończą się elementy z 1 i 2 tablicy
while (left <= H && right <= H2)
{
// Porównujemy elementy z tablicy[i] (H)
// I tablicy[j] (H+1)
if (table[left] < table[right])
{
// Jeśli tablica 'left' jest mniejsza od 'right'
// Wrzucamy wartość do tablicy pomocnicznej 'midTable'
midTable[middle] = table[left];
left++;
}
else
{
// Jeśli tablica 'right' jest mniejsza od 'left'
// Wrzucamy wartość do tablicy pomocnicznej 'midTable'
midTable[middle] = table[right];
right++;
}
// Inkrementujemy index tablicy
middle++;
}
while (left <= H)
{
// Skopiuj wszystkie pozostałe elementy z lewej tablicy 'left'
// do tablicy pomocniczej 'midTable'
midTable[middle] = table[left];
middle++;
left++;
}
while (right <= H2)
{
// Skopiuj wszystkie pozostałe elementy z prawej tablicy 'right'
// do tablicy pomocniczej 'midTable'
midTable[middle] = table[right];
middle++;
right++;
}
// H + 1 żeby sortowanie nie wyskakiwało poza tablicę
for (left = H1 + 1; left < middle; left++)
{
// Wrzuć wszystkie posortowane elementy do oryginalnej tablicy
table[left] = midTable[left];
}
}