algorytm.org

Implementacja w Java



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Sortowanie stogowe (heapsort) - Implementacja w Java
Ocena użytkownikóww: *****  / 0
SłabyŚwietny
Nadesłany przez mephisto, 21 sierpnia 2014 15:11
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

HeapSort.java:
/**
 * Implementacja sortowania przez kopcowanie.
 * www.algorytm.org
 * 
 * @author mephisto
 * 
 * @param <Key>
 *            typ klucza, rozszerza interfejs Comparable aby mozna go bylo
 *            swobodnie porownywac. Oczywiste, ze nalezaloby dodac jeszcze
 *            konstruktor, ktory przyjmuje Comparator, aby mozna bylo przekazac
 *            dowolny sposob porownywania
 */
public class HeapSort<Key extends Comparable<Key>> {

	public void sort(Key[] arr) {
		// tworzenie kopca
		int size = arr.length;
		for (int k = size / 2; k >= 1; k--) {
			sink(arr, k, size);
		}

		// sortowanie
		while (size > 1) {
			// celowo zamieniamy korzen z ostatnim elementem, aby potem go
			// zatopic i tym samym uzyskac najwiekszy element w indeksie 0
			exchange(arr, 1, size--);
			// zatapiamy korzen i przywracamy strukture kopca
			sink(arr, 1, size);
		}
	}

	/**
	 * 
	 * @param arr
	 * @return {@code true} jesli tablica jest posortowana, w przeciwnym razie
	 *         {@code false}
	 */
	public boolean isSorted(Key[] arr) {
		for (int i = 1; i < arr.length; i++)
			if (less(arr, i, i - 1))
				return false;
		return true;
	}

	// metoda do "zatapiania" elementu
	private void sink(Key[] arr, int k, int size) {
		// k jest indeksem rodzica
		while (2 * k <= size) {
			// indeks dziecka
			int j = 2 * k;
			// sprawdzamy, ktore z dzieci jest mniejsze
			if (j < size && less(arr, j, j + 1))
				j++;
			// sprawdzamy czy dziecko jest wieksze od rodzica
			if (!less(arr, k, j))
				break;
			// jest wieksze wiec zamieniamy
			exchange(arr, k, j);
			// zschodzimy poziom nizej w hierarchi kopca
			k = j;
		}
	}

	// zwraca true jesli element tablicy pod indeksem i jest mniejszy od
	// elementu pod indeksem j
	// celowo przeindeksowane o 1(metoda bedzie dostawac indeks wiekszy o jeden,
	// wtedy latwiej obliczac dzieci w kopcu)
	private boolean less(Key[] arr, int i, int j) {
		return arr[i - 1].compareTo(arr[j - 1]) < 0;
	}

	// zamienia miejscami dwa elementy w tablicy
	// celowo przeindeksowane o 1(metoda bedzie dostawac indeks wiekszy o jeden,
	// wtedy latwiej obliczac dzieci w kopcu)
	private void exchange(Key[] arr, int i, int j) {
		Key tmp = arr[i - 1];
		arr[i - 1] = arr[j - 1];
		arr[j - 1] = tmp;
	}

	/**
	 * Wypisuje cala tablice.
	 * 
	 * @param arr
	 *            tablica do wypisania
	 */
	public void printAll(Key[] arr) {
		for (Key it : arr) {
			System.out.print(it + " ");
		}
		System.out.println();
	}

	// klient testowy
	public static void main(String[] args) {
		Integer[] arr = new Integer[] { -4, 3, 4, 4, 111, -8 };
		HeapSort<Integer> instance = new HeapSort<Integer>();
		System.out.println("Przed sortowaniem: ");
		instance.printAll(arr);
		instance.sort(arr);
		System.out.println("Po sortowaniu: ");
		instance.printAll(arr);
	}
}
Dodaj komentarz