Quicksort w javie

0

Witam wszystkich, to mój pierwszy post tutaj :) Mam kłopot z quicksortem w javie. Mianowicie trochę sortuje, ale nie tak, jak by się tego chciało. Prosiłbym o jakąś pomoc albo wskazówki, ponieważ siedzę nad tym i rwę sobię włosy z głowy :) Oto kod:

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int tab[] = new int[10];
		tab[0] = 3;
		tab[1] = 1;
		tab[2] = 74;
		tab[3] = 15;
		tab[4] = 26;
		tab[5] = 52;
		tab[6] = 12;
		tab[7] = 44;
		tab[8] = 17;
		tab[9] = 9;

		Quicksort tablica = new Quicksort(tab);
		tablica.wyswietl(tab);
	}

}
public class Quicksort {
	
	int[] liczby;

	public Quicksort(int tab[]){
		liczby = tab;
		sortuj(0, tab.length-1);
	}
	
	public void wyswietl(int tab[]){
		for (int i=0; i<tab.length; i++){
			System.out.print(tab[i] + " ");
		}
	}
		
	public void zamienLiczby(int a, int b){
		int temp = liczby[a];
		liczby[a] = liczby[b];
		liczby[b] = temp;
	}

	public void sortuj(int left, int right){
		int m = (left+(right-left))/2;
		int i = left;
		int j = right;
		
		while (i<=j){
			while (liczby[i]<liczby[m]){
				i++;
			}
			while (liczby[j]>liczby[m]){
				j--;
			}
			if (i<=j){
				zamienLiczby(i,j);
				i++;
				j--;
			}	
		}
		if (left < j){
			sortuj(left,j);
		}
		if (right > i){
			sortuj(right,i);
		}
	}
	
}
1

Jesteś pewien że pivot ci się przypadkiem nie przesuwa (jako że pamiętasz tylko indeks pivota a nie jego wartość)?

0

Hmmm. Wydaje mi się, że zanim nie dojdzie do tej części rekurencyjnej to pivot pozostaje w miejscu. Bo liczby jedynie zamieniają się miejscami. Chociaż mogę się mylić

EDIT: Zamieniłem w kodzie pivot na wartość i cały czas jest to samo

1

Czy to

int m = (left+(right-left))/2;

nie powinno wyglądać czasem tak int m = (left+right)/2;

?
1

Powinno być:
m = left + (right - left) / 2;

Wtedy zadziała poprawnie przy tablicach na > 2^30 elementów.

0

Faktycznie, o jeden nawias za dużo dałem. Dodam też, że tablicę
3 1 74 15 26 52 12 44 17 9
sortuje mi do postaci
1 3 9 15 17 12 52 44 26 74 niezależnie od wymienianych wcześniej rzeczy.

1

sortuj(i, right);

Pivot ci się poprzesuwa. Zapamiętaj jego wartość, albo zadbaj, żeby się nie przesuwał w trakcie dzielenia na partycje.

1

Tak jak pisałem -> musisz pamiętać pivota a nie jego pozycję bo się zmienia. Poza tym tak jak zauważył @Wibowit źle sortujesz prawy kawałek bo lewym końcem jest 'i' a nie right.

0

Problem rozwiązany. Błąd oczywiście strasznie głupi, zamiast sortuj(i,right) napisałem sortuj(right,i) :D Dzięki wielkie za pomoc!

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