Sortowanie Shella

1

Witam serdecznie, napisałem funkcję, która sortuje tablice za pomocą sortowania Shella i działa prawie dobrze. Prawie, ponieważ na ostatnim miejscu cały czas pojawia się cyferka 4, reszta tablicy jest dobrze posortowana. Nie mam pojęcia, gdzie jest błąd

 
int *shell(int *tab, int size)
{


	int h = 1;
	int i, x, j, z;

	do { h = 3 * h + 1; } while (h < size / 9);


	do{
		for (i = h + 1; i <= size; i++)
		{

			x = tab[i -1]; j = i;
			do{
				tab[j - 1] = tab[j - h - 1];
				j = j - h;
			} while (j >= h + 1 && x<tab[j - h - 1]);
			tab[j -1] = x;
		}
		h /= 3; //zmniejszenie wartości h
	} while (h > 0);

	printf("Po sortowaniu:\n\n");
	for (z = 0; z < size; z++) printf("%d ", tab[z]);
	getchar();
	return tab;
}

Z góry dziękuję za wszelką pomoc i radę :)

2

Hej,
moim zdaniem głównym problemem byl u Ciebie najbardziej zagnieżdżony do - while, przy którym rozsuwales elementy tablicy niezależnie od tego czy powinny być zamienione, wcześniej powinieneś sprawdzić warunek.
Dodatkowo, możesz sie zastanowić nad działaniem na indeksach (zbędna inkrementacja, a później dekrementacja).

int *shell(int *tab, int size)
{
    int h = 1;
    int i, x, j, z;
 
    do { h = 3 * h; } while (h < size / 9);
    do{
        for (i = h; i < size; i++)
        {
            x = tab[i]; 
            j = i;
            while (j >= h && x<tab[j - h]){
                tab[j] = tab[j - h];
                j = j - h;
            }
            tab[j] = x;
        }
        h /= 3; //zmniejszenie wartości h
    } while (h > 0);
 
    printf("\nPo sortowaniu:\n");
    for (z = 0; z < size; z++) printf("%d ", tab[z]);
    getchar();
    return tab;
}

Można to napisać prościej, dla h = 8:

int A[] = {2, 5, 7, 2, 1, 10, 9, 22};
int N = sizeof(A)/sizeof(A[0]);

for(int h = 8; h > 0; h /= 2) {
	for(int i=h; i < N; i +=h) {
		for(int j=i-h; j >= 0; j-=h) {
			if(A[j] > A[j+h]) {
			    swap(A[j], A[j+h]);
			}
		}
	}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1