• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie w javie

Object Storage Arubacloud
0 głosów
1,317 wizyt
pytanie zadane 17 maja 2018 w Java przez lilianna97 Początkujący (310 p.)

Witam

Poniżej jest napisany program w javie , który sortuje metodą przez wybieranie. Czy mógłby mi ktoś powiedzieć jak napisać pętle?
Ma pobierać w sposób losowy liczby od 0-100 i je posortować. Wiem że początek będzie wyglądać tak

package insertionsort;
import java.util.Random;
import java.util.Scanner;

public class Insertionsort {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    int pom,j;
    Scanner scOb = new Scanner(System.in);
    System.out.println("Ile liczb wylosować?");
    int x =scOb.nextInt();
    int [] tab = new int [x];
    Random generator = new Random();

    for(int i=0;i<tab.length;i++){
        tab[i]=generator.nextInt(100);
        System.out.print(" "+tab[i] + " ");
komentarz 18 maja 2018 przez Wiciorny Ekspert (270,910 p.)
tu na górze nie ma sortowania... :)

2 odpowiedzi

0 głosów
odpowiedź 18 maja 2018 przez RafalS VIP (122,820 p.)
wybrane 29 maja 2018 przez lilianna97
 
Najlepsza

Jeśli potrzebujesz po prostu posortować liczby to zrób tak jak sugeruje kolega : import java.utils.Arrays i Arrays.sort(twojaTablica);

Ale jeśli uczysz się algorytmów sortowania to przeczytaj dalszą część :P

Cala idea sortowania przez wstawianie to przelecenie po calej tablicy i przesuwanie liczb tak zeby tablica od 0 do analizowanej liczby byla posortowana.
Inaczej ujmując bierzesz kolejne liczby z tablicy i cofasz się porównując liczby w tablicy tak, żeby znaleźć miejsce w które pasuje analizowana liczba. Wstawianie w odpowiednie miejsce można porównać do wpychania. Wyciagasz jedną - zostaje tam wolne miejsce. Chcesz ją wstawić gdzieś bardziej z przodu, wiec robisz jej miejsce przesuwając wszystkie liczby miedzy nią a tym pustym w prawo i wstawiasz wybraną liczbe w powstałe puste miejsce.
Tzn np 9 8 1 3
analizujemy 9: zostaje na swoim miejscu: 9 8 1 3 (ten krok nigdy nic nie zmienia wiec sie go pomija w algorytmie)
analizujemy 8: 8 < 9, wiec "wpychamy" 8 na początek: 8 9 1 3
analizujemy 1: jest mniejsza od wszystkich przed nia wiec "wpychamy" ją na poczatek: 1 8 9 3
analizujemy 3: porownujemy liczby za nia i wychodzi, ze pasuje pomiedzy 1 a 8, więc ją tam wpychamy.

Teraz bardziej technicznie - na czym polega wepchnięcie liczby w jej miejsce. Najlepiej jest to zrobić tak:
tablica: 1 4 8 9 3, analizujemy 3:
mniejsze od 9 wiec przestawiamy 9 o 1 w prawo: 1 4 8 9 9. Zauważ, że nadpisaliśmy liczbę 3, nie obchodzi to nas bo mamy ją zapamiętaną jako analizowaną liczbe tzw klucz. Moglibyśmy je normalnie zamieniać tak jak w każdym innym sortowaniu, ale jak się zaraz przekonasz nie jest to konieczne. Idziemy z naszą trójką dalej w lewo: 8 też jest wieksze od 3, wiec przestawiamy ósemke: 1 4 8 8 9. Idziemy dalej - 4 też jest większe od 3: 1 4 4 8 9, lecimy dalej: 1 jest już mniejsze od 3 wiec znaleźliśmy miejsce naszą trójeczkę i ją wstawiamy: 1 3 4 8 9. 

Mam nadzieję, że rozjaśniłem jak to działa i czemu można nadpisywać liczby. Jeśli dalej masz wątpliwości jak to działa to możesz zobaczyć na animacje na wikipedii: https://pl.wikipedia.org/wiki/Sortowanie_przez_wstawianie.


Zakodziłem sobie to, żeby zobaczyć czy dalej to pamiętam :D:

        //key to klucz, czyli liczba ktora bedziemy wstawiac na jej miejsce
        //j to iterator do wewnetrznej petli
        int key, j;
            //petle startujemy od i = 1, bo pierwszego elementu nie ma z czym porowywac,
            //inaczej mowiac 1-elementowa tablica juz jest posortowana
            for (int i = 1; i < array.length; i++) {
                //wybieramy klucz, czyli liczbe dla ktorej bedziemy szukac miejsca
                key = array[i];
                //j to indeks liczby porownywanej do klucza, startuje od pierwszej liczby przed i
                j = i - 1;
                //dopoki nie wyszlismy przed tablice oraz badana liczba jest wieksza od klucza
                while(j >= 0 && array[j] > key){
                    //normalnie moglibysmy tutaj zrobic zamiane liczb, ale skoro
                    //w tym algorytmie stosuje sie lekka optymalizacje z nadpisywaniem
                    //liczb, bo zapamietujemy key wczesniej
                    array[j+1] = array[j];
                    j--;
                }
                //wstawiamy key w jego miejsce
                //zwroc uwage na j+1, to dlatego ze na koncu petli zawsze jest j--
                //gdy petla sie przerwie to j pokazuje na miejsce jedno przed tym ktorego szukamy
                array[j+1] = key;
        }

 

–2 głosów
odpowiedź 18 maja 2018 przez plucins Stary wyjadacz (11,110 p.)

W javie w klasie Arrays jest metoda sort(), której możesz użyć w tym przypadku.
 

Arrays.sort

 

komentarz 18 maja 2018 przez Wiciorny Ekspert (270,910 p.)

jak zadanie brzmi napisz  sortowanie z wykorzystaniem algorytmu ...  to chyba logiczne że chodzi, aby ktos umiejętnie zastosował algorytm a nie żeby robiła za niego maszyna ... zresztą utli.Java.Arrays i metoda sort, nie sortuje tego w taki sposób nawet jakby wymagało zadanie.

he sorting algorithm is a Dual-Pivot Quicksort by Vladimir Yaroslavskiy, Jon Bentley, and Joshua Bloch. This algorithm offers O(n log(n)) performance on many data sets that cause other quicksorts to degrade to quadratic performance, and is typically faster than traditional (one-pivot) Quicksort implementations.

Podobne pytania

0 głosów
2 odpowiedzi 207 wizyt
pytanie zadane 17 maja 2018 w Java przez lilianna97 Początkujący (310 p.)
+1 głos
1 odpowiedź 83 wizyt
0 głosów
0 odpowiedzi 93 wizyt
pytanie zadane 7 lipca 2023 w Java przez Davidxx Nowicjusz (190 p.)

92,632 zapytań

141,500 odpowiedzi

319,878 komentarzy

62,011 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...