selectionSort nie sortuje

0

Witam dopiero zaczynam chciałbym napisać program z sortowaniem mam zadanie doszedłem do pewnego momentu ale dalej stoję w miejscu nie mogę ruszyć czy mógłby ktoś pomóc,, Mianowicie wyświetla mi tablice ale nie wiem co napisać by ja posortowało.

package praceDomowe;

/*Spróbuj zaimplementować sortowanie przez wybieranie. Nie patrz na kod
na wiki, tylko postaraj się zrozumieć co się dzieje na przykładzie,
łatwiej to wtedy zrobić niż jak się czyta czyjś kod:
http://pl.wikipedia.org/wiki/Sortowanie_przez_wybieranie
	*/

public class Zad4 {
	public static void wyswietl(int[] t) {
		for (int i = 0; i < t.length; i++) {
			System.out.print(t[i] + " ");
		}
		System.out.println();
	}

	public static int[] generuj(int n) {
		int[] t = new int[n];
		for (int i = 0; i < t.length; i++) {
			t[i] = (int) (Math.random() * 10);
		}
		return t;

	}

	public static void sortuj(int[] t) {
		//zamiana t[i] z t[minIndex];
	}

	//napisz metode ktora zwraca indeks minimum w tablicy t od miejsca i do konca tablicy gdze i [0; n-1] gdzie n to liczba elementow tablicy
	public static int min(int i, int[] t) {
		int min = t[0];
		int minIndex = 0;
		for (; i < t.length; i++) {
			if (min > t[i]) {
				min = t[i];
				minIndex = i;
			}
		}
		return minIndex;

	}

	public static void main(String[] args) {
		int[] t = generuj(10);
		wyswietl(t);
		sortuj(t);
		wyswietl(t);
	}

}
 

Java

1

Ciężko strawny kod. Generalnie masz 2 petle, 1 okresla na jaka pozycje masz wstawic, a 2 poszukuje najmniejszego elementu w "nie ustawionej" cześci tablicy. Twoja funkcja min zdaje się realizować tą 2 pętle. Wiec w funkcji sort musisz dodać tą 1 petle. Ja proponuje coś takiego


public static void sortuj(int[] t) 
{
       for(int i=0; i<t.length-1;i++)//gdyz po dojsciu do ostatniego elementu mamy pewnosc ze jest najmniejszym
       {
           int index = min(i,t);
           int pom = t[i];
           t[i]=t[index];
           t[index]=pom;
       }
  }

Zauwaz ze po itym kroku tablica jest juz uporzadkowana do itego elementu wiec mozna przeszukiwac od i a nie od 0;)
Mozesz sobie dodac jeszcze kawałek kodu odpowiedzialny za to, że aktualny element jest najmniejszym wiec nie ma sensu zamieniac miejscami.
Zobacz sobie czy działa bo na szybkiego napisałem

0
class ArrayStructures {

        /* Tworzymy tablicę o rozmiarze 10 */
	private int[] theArray = new int[10];

        /* To w zasadzie mozna by zastapic theArray.length */
	private int arraySize = 10;

        /* Funkcja wypelnia tablice losowymi liczbami
         * w petli je losujemy i kolejno przypisujemy indexom tablicy theArray (tej wyzej)
         */
	public void generateRandomArray() {

		for (int i = 0; i < arraySize; i++) {

			theArray[i] = (int)(Math.random() * 10) + 10;

		}

	}
 
        /* Odpowiednik print_r z php
         * przedstawia nam to co robi program w tzw. human readable format, jak odpalisz program to zobaczysz :)
         */
	public void printHorzArray(int i, int j) {

		for (int n = 0; n < 51; n++) System.out.print("-");

		System.out.println();

		for (int n = 0; n < arraySize; n++) {

			System.out.print("| " + n + "  ");

		}

		System.out.println("|");

		for (int n = 0; n < 51; n++) System.out.print("-");

		System.out.println();

		for (int n = 0; n < arraySize; n++) {

			System.out.print("| " + theArray[n] + " ");

		}

		System.out.println("|");

		for (int n = 0; n < 51; n++) System.out.print("-");

		System.out.println();

		if (i != -1) {

			for (int l = 0; l < (5 * (i - j) - 1); l++) System.out.print(" ");

			System.out.print(i);

		}

		System.out.println();

	}

        /* Funkcja podmienia wartosci dzieki temu podczas obrotu petli najmniejsza liczba
         * jest wrzucana na poczatek, a ta z poczatku laduje na miejsce tamtej, tmp jest po to
         * zeby gdzies ta wartosc przechowac podczas zamiany
         */
	public void swapValues(int indexOne, int indexTwo) {

		int temp = theArray[indexOne];

		theArray[indexOne] = theArray[indexTwo];

		theArray[indexTwo] = temp;

	}
        
        /* Nasza glowna funkcja sortujaca
         * Petla wewnetrzna porownuje wartosc minimalna tablicy z kolejnymi jej wartosciami
         * jezeli sie okazuje ze znajduje mniejsza to wtedy przypisuje ja do minimum
         * Petla zewnetrzna zamienia wartoci, znaleziana minimum = y z x oraz 
         * drukuje kazdy kolejny krok zebysmy mogli sledzic co sie dzieje */
	public void selectionSort() {

		for (int x = 0; x < arraySize; x++) {

			int minimum = x;

			for (int y = x; y < arraySize; y++) {

				if (theArray[minimum] > theArray[y]) {

					minimum = y;

				}

			}

			swapValues(x, minimum);

			printHorzArray(x, -1);

		}
	}

public static void main(String[] args) {
        // Tworzymy nowy obiekt naszej klasy
	ArrayStructures newArray = new ArrayStructures();
        
        //Generujemy liczby
	newArray.generateRandomArray();
         
	newArray.printHorzArray(-1, -1);
        
        /* Sortujemy :) */
	newArray.selectionSort();

}

}

Staraj się trzymać zasady, że każda funkcja robi maksymalnie jedną rzecz np. jedna sortuje, druga zamienia wartości trzecia drukuje tablicę itd. i nazywaj zmienne tak zeby Ci sie bylo latwo odnalezc, bo nazwanie zmiennej t to moze oznaczac cokolwiek. Ja dzisiaj w pracy stacilem 30 min bo ktos ponazywal rzeczy idiotycznie, a przy 3000 linijkach kodu to naprawde boli :D

PS. Mam świetny kurs odnośnie Javy, jeżeli będziesz zainteresowany to odezwij się :)

0
skytrack napisał(a):

Ciężko strawny kod. Generalnie masz 2 petle, 1 okresla na jaka pozycje masz wstawic, a 2 poszukuje najmniejszego elementu w "nie ustawionej" cześci tablicy. Twoja funkcja min zdaje się realizować tą 2 pętle. Wiec w funkcji sort musisz dodać tą 1 petle. Ja proponuje coś takiego


public static void sortuj(int[] t) 
{
       for(int i=0; i<t.length-1;i++)//gdyz po dojsciu do ostatniego elementu mamy pewnosc ze jest najmniejszym
       {
           int index = min(i,t);
           int pom = t[i];
           t[i]=t[index];
           t[index]=pom;
       }
  }

Zauwaz ze po itym kroku tablica jest juz uporzadkowana do itego elementu wiec mozna przeszukiwac od i a nie od 0;)
Mozesz sobie dodac jeszcze kawałek kodu odpowiedzialny za to, że aktualny element jest najmniejszym wiec nie ma sensu zamieniac miejscami.
Zobacz sobie czy działa bo na szybkiego napisałem

Ok działa musiałem jeszcze zmienić trochę swój kod i wystartowałem od " i " wszystko śmiga dzięki wielkie

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