Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[TuT] Segregacja liczb.


knugi

Rekomendowane odpowiedzi

Opublikowano

Cześć!

 

Taki mały dopisek, że możemy segregować różny typy zmiennych ja tutaj przedstawiam integer, ponieważ jest najprostszy, wystarczy tylko zmienić typy tablic np:

double[]
float[]

    Najpierw co musimy zrobić to zrobić klasę.

package poradnik;

public class SegregacjaMPC {
	public static void main(String[] args){
		
	}
}

Następnie robimy nową metodę:

static int[] segregacja (int[] a){
	int[] tab  = new int[a.length];
		
		
	return tab;
}

i w tej metodzie musimy zrobić dwie pętle:

for(int i=0;i<tab.length;i++){
			
	for(int j=0;j<tab.length;j++){
				
	}
}

następnie do pierwszej pętli wrzucamy dwa integery

for(int i=0;i<tab.length;i++){
	int w = 2147483647;
	int d = 0;
	for(int j=0;j<tab.length;j++){
		
	}
}

Dlaczego akurat takie? Ponieważ w to jest liczba do sprawdzania która liczba jest mniejsza a integer ma tylko taki zakres i to jest największa z możliwych liczb do próbkowania.

A liczba d jest po prostu takim przeniesieniem liczby j z drugiej pętli o czym zaraz sami się przekonacie.

 

Okay połowa za nami, teraz trzeba w drugiej pętli dać warunek aby sprawdzał czy liczba która teraz jest sprwadzana jest mniejsza od wcześniejszej i do tego służy zmienna w i ustalamy w zmiennej d kolejność która liczba ma być 'wyrzucona' z zmiennej do sprawdzania czyli po prostu nadpisujemy ją liczbą której nie używamy w tablicy ogólnie jeżeli segregujemy tylko liczby dodatnie to liczba nadpisująca może wynosić -1 lub 0(jeżeli nie będzie takowej w tablicy, bo program zacznie świrować), a jeżeli chcemy też segregować liczby ujemne to pozostawić najmniejszą liczbę z zakresu typu danych w tej sytuacji to -2147483647 i tą liczbę zablokować, by nie mogła wpaść do tablicy którą będziemy segregować.

 

Czyli ogólnie kodzik wygląda następująco:

for(int i=0;i<tab.length;i++){
	int w = 2147483647;
	int d = 0;
	for(int j=0;j<tab.length;j++){
		if(a[j]<w&&!(a[j]==-2147483647)){
			w=a[j];
			d=j;
		}
	}
}

Okay prawie gotowe, teraz trzeba jeszcze w pierwszej pętli poza drugą pętlą ustawić miejsce w tabliy segregowanej na tą liczbę która nie bedzie brana pod uwagę przy sprawdzaniu która jest najmniejsza

i do tego nam jest potrzebna zmienna d

Do nowej tablicy zapisujemy wartość najmnijeszą którą mamy w zmiennej 'w' I kod powinien się prezentować tak:

static int[] segregacja (int[] a){
	int[] tab  = new int[a.length];
	for(int i=0;i<tab.length;i++){
		int w = 2147483647;
		int d = 0;
		for(int j=0;j<tab.length;j++){
			if(a[j]<w&&!(a[j]==-2147483647)){
				w=a[j];
				d=j;
			}
		}
		a[d]=-2147483647;
		tab[i]=w;
	}
	return tab;
}

Segregator gotowy, teraz czas na jego użycie w głównej metodzie. To są tylko przykłady, możecie tego używać jak sobie chcecie.

public static void main(String[] args){
	System.out.println("Segregacja liczb (10, 6, 8, 15): ");
	for(int i : segregacja(new int[] {10, 6, 8, 15})){
		System.out.println(i);
	}
	System.out.println("\nPozycja 3 z segregowanych liczb (57, 45, 1, 5, 7): "+segregacja(new int[] {57, 45, 1, 5, 7})[2]);
	System.out.println("Przekładanie tablicy do tablicy: ");
	int[] tab = new int[3];
	for(int i=0;i<tab.length;i++){
		tab[i]=segregacja(new int[] {5, 7, 6})[i];
		System.out.println(tab[i]);
	}
}

A tak wygląda cała klasa:

 

 

package poradnik;

public class SegregacjaMPC {
	public static void main(String[] args){
		System.out.println("Segregacja liczb (10, 6, 8, 15): ");
		for(int i : segregacja(new int[] {10, 6, 8, 15})){
			System.out.println(i);
		}
		System.out.println("\nPozycja 3 z segregowanych liczb (57, 45, 1, 5, 7): "+segregacja(new int[] {57, 45, 1, 5, 7})[2]);
		System.out.println("Przekładanie tablicy do tablicy: ");
		int[] tab = new int[3];
		for(int i=0;i<tab.length;i++){
			tab[i]=segregacja(new int[] {5, 7, 6})[i];
			System.out.println(tab[i]);
		}
		
	}
						
		
		
	static int[] segregacja (int[] a){
		int[] tab  = new int[a.length];
		for(int i=0;i<tab.length;i++){
			int w = 2147483647;
			int d = 0;
			for(int j=0;j<tab.length;j++){
				if(a[j]<w&&!(a[j]==-2147483647)){
					w=a[j];
					d=j;
				}
			}
			a[d]=-2147483647;
			tab[i]=w;
		}
		return tab;
	}
	
}

 

 

A tutaj log z konsolki

Segregacja liczb (10, 6, 8, 15): 
6
8
10
15

Pozycja 3 z segregowanych liczb (57, 45, 1, 5, 7): 7
Przekładanie tablicy do tablicy: 
5
6
7

Jak zawsze hejty mile widziane

 

Pozdrawiam #Knugi

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Opublikowano

Albo można zrobić:

Arrays.sort(ints);

 

Szybciej, łatwiej, wydajniej.

A jak ma się jeszcze więcej wynikow to jest też Arrays.parallelSort() ale przy intach raczej średnio coś daje :P

1438614356923701010629.png

 

Opublikowano

Jak zawsze hejty mile widziane

Nie ma problemu %5E%5E.png.

1. Kod byłby czytelniejszy gdyby nazwy coś mówiły :s ("SprawdzTrojkat2MPC"?)

2.

Dlaczego akurat takie? Ponieważ w to jest liczba do sprawdzania która liczba jest mniejsza a integer ma tylko taki zakres i to jest największa z możliwych liczb do próbkowania. [...]  nadpisujemy ją liczbą której nie używamy w tablicy ogólnie jeżeli segregujemy tylko liczby dodatnie to liczba nadpisująca może wynosić -1 lub 0(jeżeli nie będzie takowej w tablicy, bo program zacznie świrować), a jeżeli chcemy też segregować liczby ujemne to pozostawić najmniejszą liczbę z zakresu typu danych w tej sytuacji to -2147483647 i tą liczbę zablokować, by nie mogła wpaść do tablicy którą będziemy segregować.

To nie jest dobre rozwiązanie. Nieczytelne, niepotrzebnie skomplikowane i psuje się przy -2147483647 (które zresztą nie jest najmniejszą możliwą wartością int). Jeśli musisz korzystać z takich wartości, to lepiej

używaj stałych (tutaj Integer.MAX_VALUE i MIN_VALUE).

3. Ustawiasz wartości w przekazanej tablicy na -2147483647, co też komplikuje użycie.

4. Tak jak poprzednik - złożoność n^2, więc niestety jest to bezużyteczne.

 

Ale gz za poświęcony czas i chęci. Pewnie komuś się przyda.

708121422388637873334.png

Opublikowano

Ale z was hejty, juz wole takie cos z ladnym opisaniem (widac ze sie stara) niz java.array ...

Ciekawe ktory z was wyjasni quicksorta w przystepnym jezyku dla newbow, zapraszam.

@Jaca777 tera to se mozesz, staraj sie byc milszy dla ludzi w przyszlosci.

Opublikowano

Jaca 1. To raczej nie wpływa na działanie programu to tylko wiadomość dla autora programu co gdzie się znajduje.

 

2. To są najmniejsze liczby dla Integera i nie da się niższej bo eclipse obrazu wywala błąd. I z tą zmienna to masz rację żeby po prostu się nie zgubić przy wpisywaniu liczb, bo potem są dzikie czasem problemy :)

3. Nie rozumiem dlaczego to komplikuje życie przecież to jest dobrze napisane i działa jak ma działać :)

 

4. Tego nie rozumiem co jest ta zależności możesz to bardziej rozpisać?

 

I szczerze dziękuję, motywuje mnie to do dalszej pracy ;)

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Opublikowano

1. To raczej nie wpływa na działanie programu to tylko wiadomość dla autora programu co gdzie się znajduje.

Wpływa na to, jak czytelny będzie ten kod, a zatem jak łatwe będzie jego zrozumienie, rozbudowa i naprawa błędów. Więc pośrednio wpływa też na działanie.

Poza tym ułatwisz czytanie tego poradnika.

 

2. To są najmniejsze liczby dla Integera i nie da się niższej bo eclipse obrazu wywala błąd. I z tą zmienna to masz rację żeby po prostu się nie zgubić przy wpisywaniu liczb, bo potem są dzikie czasem problemy :)

Miałem na myśli to, że najmniejszą liczbą jest -2147483648, a nie -2147483647. Ale co ważniejsze wprowadzasz tym sporo zamieszania do kodu. Możesz to zrobić w inny sposób, całkowicie pomijając maksymalne i minimalne wartości.

 

3. Nie rozumiem dlaczego to komplikuje życie przecież to jest dobrze napisane i działa jak ma działać :)

Metoda, którą napisałeś, nie służy do sortowania tablicy. Ona zwraca jej posortowaną kopię. Używana będzie, gdy ktoś będzie potrzebował posortowanych wartości z jakiejś tablicy pozostawiając ją niezmienioną.

 

4. Tego nie rozumiem co jest ta zależności możesz to bardziej rozpisać?

Ilość powtórzeń porównywania wartości i odczytu tablicy jest u Ciebie równa ilości wartości w tablicy podniesionej do kwadratu. Istnieją wydajniejsze sposoby sortowania, jak np. quick sort czy merge sort, które wymagają mniejszej ilości powtórzeń.

 

@knugi - Z tym nazewnictwem to mówiłem głównie o w, d, a i tab.

708121422388637873334.png

Opublikowano

A po co to kumu? A dlaczego? ;)

Nie wierzę, że w Javie nie ma wbudowanych metod do tego / sprawdzonych bibliotek. No chyba, że to tutorial używania pętli i tablic - ale mało czytelny. 

Chcesz precyzyjnej i zrozumiałej odpowiedzi? - Zadaj precyzyjne i zrozumiałe pytanie. Nie przyjmuję zleceń.
Nie odpowiadam na priv na pytania, które można zadać na forum. Chcesz mojej pomocy - oznacz mnie w poście =>  @"Hans Kloss PL" 

Opublikowano

@fsociety xDD

 

@Jaca777

1. Już poprawiłem i z tym się zgodzę lecz to tylko jest do tego, a jak człowiek jest ogarnięty to i w takich sprawach się połapie, lecz będzie miał o wiele ciężej niż normalnie podpisane package i classy :P

 

2. Sprawdziłem i masz rację :)

 

3.

 

4. Tak n2 Bo jeszcze nie umiem na jednej pętli tego zrobić albo w ogóle bez pętli :/

Jeżeli pomogłem, daj + Ciebie nic nie kosztuje Mi znaczy wiele.

 

 

 

 

 

 

 

Zachęcam do podsyłania pomysłów na film jako poradniki na YouTube

 

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...