Permalänk
Medlem

Sortera matris i java

Hejsan, här har jag en matris:

int differencearray[][] = {{30, 15, 9, 13, 24},
{15, 30, 18, 16, 17},
{9, 18, 30, 12, 27},
{13, 16, 12, 30, 25}};

Jag behöver hjälp med att skapa en sorteringsalgoritm som sorterar denna matris enligt DETTA önskade resultat:

int differencearray[][] = {{9, 18, 30, 12, 27},
{13, 16, 12, 30, 25}
{15, 30, 18, 16, 17},
{30, 15, 9, 13, 24}};

Jag får inte använda array.sort och liknande, utan sorteringen måste ske manuellt med loopar och så vidare.
Evigt tacksam till han som orkar komma med en lösning.

Permalänk
Medlem

Om du inte haft en matris utan bara en array med siffror, hade du själv kunnat skriva sorteringsalgoritmen då?

Permalänk
Medlem
Skrivet av blackcoffee:

Om du inte haft en matris utan bara en array med siffror, hade du själv kunnat skriva sorteringsalgoritmen då?

Är väldigt färsk, är rädd att jag inte begriper mig på detta ännu.

Permalänk
Medlem

Vad jag kan se försöker du sortera en matris så att raderna kastas om baserat på första elementet i varje rad. Så lättaste sättet är nog att börja med att sortera en array med 30, 15, 9, 13 så den blir 9, 13, 15, 30. När du klarat det kan du ändra koden så du kastar om hela rader istället.

Baserat på hur du har formulerat frågan antar jag det är ett skolarbete av något slag. Du har då säkert en bok eller länkar till online-resurser om algoritmer. Vad hittar du i dessa böcker eller resurser om sortering?

Permalänk
Medlem

Tips: grunden i den algoritm du ska skriva är att jämföra siffror parvis och sen flytta så att mindre siffror alltid hamnar före större siffror. Det finns många sätt att göra detta, men om du ska lära dig hur det funkar måste du ju själv skriva koden.

Permalänk
Medlem
Skrivet av blackcoffee:

Vad jag kan se försöker du sortera en matris så att raderna kastas om baserat på första elementet i varje rad. Så lättaste sättet är nog att börja med att sortera en array med 30, 15, 9, 13 så den blir 9, 13, 15, 30. När du klarat det kan du ändra koden så du kastar om hela rader istället.

Baserat på hur du har formulerat frågan antar jag det är ett skolarbete av något slag. Du har då säkert en bok eller länkar till online-resurser om algoritmer. Vad hittar du i dessa böcker eller resurser om sortering?

Ditt antagande är korrekt, det är just precis det jag försöker göra.

Gällande tillgängliga resurser så uppfattar jag och många av mina kursare att instruktionerna är väldigt magra när det kommer till att lösa det här problemet.

Jag har kikat på internet i timmar, men finner att det finns föga lite intresse att göra detta utan "redan skapta" metoder. Den typen av metoder som vi inte får använda oss av i kursen.

Har mailat lärare, men förväntar mig inget svar i dessa semestertider. Uppgiften å andra sidan har en deadline imorgon. Måste ha löst det då.

Permalänk
Medlem
Skrivet av blackcoffee:

Tips: grunden i den algoritm du ska skriva är att jämföra siffror parvis och sen flytta så att mindre siffror alltid hamnar före större siffror. Det finns många sätt att göra detta, men om du ska lära dig hur det funkar måste du ju själv skriva koden.

Har försökt hela dagen, antar att jag är för korkad helt enkelt... /facepalm

Permalänk
Avstängd

Sök på "bubble sort" i en sökmotor så kommer du finna hur du ska göra.

Visa signatur

AMD Ryzen 5900X, ASUS ROG Strix B550-F Gaming, Corsair RM850e, Noctua NH-D15, Corsair 64GB (2x32GB) DDR4 3600MHz CL18 Vengean, Radeon 6700 XT, Ubuntu 22.04

Permalänk
Medlem
Skrivet av vlachos:

Sök på "bubble sort" i en sökmotor så kommer du finna hur du ska göra.

Hittar exempel på bubblesort av matriser, men det är fel sortering som sker i algoritmen. Exempelvis att varje enskilt element i matrisen sorteras. Detta är inte vad jag ska göra. Förstår inte hur jag kan implementera den lösningen på mitt problem. Därav detta inlägget.

Permalänk
Medlem
Skrivet av lotusxmw:

Har försökt hela dagen, antar att jag är för korkad helt enkelt... /facepalm

Skriv ner i ord hur du skulle göra en algoritm som löser det här. Att bråka med javasyntaxen kan du göra senare.

Permalänk
Medlem
Skrivet av lotusxmw:

Ditt antagande är korrekt, det är just precis det jag försöker göra.

Gällande tillgängliga resurser så uppfattar jag och många av mina kursare att instruktionerna är väldigt magra när det kommer till att lösa det här problemet.

Jag har kikat på internet i timmar, men finner att det finns föga lite intresse att göra detta utan "redan skapta" metoder. Den typen av metoder som vi inte får använda oss av i kursen.

Anledningen till att alla rekommenderas använda färdiga algoritmer är för att det blir bättre i praktiken. Men nu ska ni ju inte skriva praktiskt användbar kod utan lära er förstå hur det funkar. Om ni nu inte har lärare som gett er resurserna nog att klara det ni ska så är det ju trist.

Jag ger ett tips till: Bubble sort. Det är en algoritm som är lätt att förstå även om den är ansedd som dålig eftersom den är långsam när man ska sortera många tal:

Bubble sort illustrerad:

När du fattat vad videon säger kan du sen enkelt googla efter kod som implementerar Bubble Sort i Java. Nästa steg är att byta från att sortera enskilda nummer till att byta plats på raderna i din matris istället.

Permalänk
Medlem
Skrivet av pine-orange:

Skriv ner i ord hur du skulle göra en algoritm som löser det här. Att bråka med javasyntaxen kan du göra senare.

Tänker mig något sånt här ungefär:

(1) loopa igenom matrisens kolumner
(2) jämför kolumnerna i förhållande till första rad värdet
(3) Byt plats på hela kolumner tills dess att ordningen är uppfylld (uppåtstigande (första rad värde) minst - störst)

Så långt tror jag mig ha rätt, men att implementera detta i kod har varit svårare än vad jag begriper.

Permalänk
Medlem

En bra start.

Börja med att skriva ett program som utan ambitioner att sortera den tar detta:

int differencearray[][] =
{{30, 15, 9, 13, 24},
{15, 30, 18, 16, 17},
{9, 18, 30, 12, 27},
{13, 16, 12, 30, 25}};

Och sen byter du plats på första och andra raden så resultatet blir detta:

int differencearray[][] =
{{15, 30, 18, 16, 17},
{30, 15, 9, 13, 24},
{9, 18, 30, 12, 27},
{13, 16, 12, 30, 25}};

Sen skriver du ett helt separat program som tar detta:

int sortarray[] = {30, 15, 9, 13}

och sen sorterar den så du får resultatet {9, 13, 15, 30}.

Om du klarar av dessa två separata steg kan du sen slå dem samman för det du vill.

Permalänk
Medlem
Skrivet av blackcoffee:

En bra start.

Börja med att skriva ett program som utan ambitioner att sortera den tar detta:

int differencearray[][] =
{{30, 15, 9, 13, 24},
{15, 30, 18, 16, 17},
{9, 18, 30, 12, 27},
{13, 16, 12, 30, 25}};

Och sen byter du plats på första och andra raden så resultatet blir detta:

int differencearray[][] =
{{15, 30, 18, 16, 17},
{30, 15, 9, 13, 24},
{9, 18, 30, 12, 27},
{13, 16, 12, 30, 25}};

Sen skriver du ett helt separat program som tar detta:

int sortarray[] = {30, 15, 9, 13}

och sen sorterar den så du får resultatet {9, 13, 15, 30}.

Om du klarar av dessa två separata steg kan du sen slå dem samman för det du vill.

Den första delen tror jag mig ha klarat av. Har skapat en metod som byter plats på "rad a" och "rad b":

public static void swapRows(int array[][], int rowA, int rowB) {
int tmpRow[] = array[rowA];
array[rowA] = array[rowB];
array[rowB] = tmpRow;
}

Den andra delen tror jag att du har missförstått, jag vill inte sortera varje element i varje rad. Jag vill att raderna sorteras enligt det första radvärdet.

Så om vi har raderna {3,2,1}, {2,5,7}, {1,9,10} så vill jag att de sorteras så här: {1,9,10}, {2,5,7}, {3,2,1}

Detta förstår jag inte.

Permalänk
Medlem
Skrivet av lotusxmw:

Den första delen tror jag mig ha klarat av. Har skapat en metod som byter plats på "rad a" och "rad b":

public static void swapRows(int array[][], int rowA, int rowB) {
int tmpRow[] = array[rowA];
array[rowA] = array[rowB];
array[rowB] = tmpRow;
}

Bra!

Skrivet av lotusxmw:

Den andra delen tror jag att du har missförstått, jag vill inte sortera varje element i varje rad. Jag vill att raderna sorteras enligt det första radvärdet.

Så om vi har raderna {3,2,1}, {2,5,7}, {1,9,10} så vill jag att de sorteras så här: {1,9,10}, {2,5,7}, {3,2,1}

Detta förstår jag inte.

Anledningen till att jag rekommenderade att sortera en enkel array först är för att det är ett typiskt sätt att lösa problem - bryt ned dem till olika delar som du löser separat och sen sätter ihop dem.

Först ska du få ordning på att sorteringsalgoritmen funkar för ett enkelt fall, som t.ex. en vanlig array.

När du sen vet att den funkar så ändrar du från att sortera enskilda siffror till att sortera rader baserat på första elementet i raden.

Permalänk
Medlem
Skrivet av blackcoffee:

Bra!

Anledningen till att jag rekommenderade att sortera en enkel array först är för att det är ett typiskt sätt att lösa problem - bryt ned dem till olika delar som du löser separat och sen sätter ihop dem.

Först ska du få ordning på att sorteringsalgoritmen funkar för ett enkelt fall, som t.ex. en vanlig array.

När du sen vet att den funkar så ändrar du från att sortera enskilda siffror till att sortera rader baserat på första elementet i raden.

Så här ser mitt försök ut:

boolean shouldContinue = true;
while(shouldContinue){

for(int i = 0; i < differencearray.length-1; i++){

if(differencearray[i][0] > differencearray[i+1][0]){
swapRows(differencearray, i, i+1);
}
}
shouldContinue = false;
}

Det fungerar inte, och jag vet inte varför.

Permalänk
Medlem

Nu fungerar det, tackar så hjärtligt för alla svar! Superschysst!
Mvh, lotusxmw

for(int i = 0; i < differencearray.length; i++){
for(int j = i+1; j < differencearray.length; j++){

if(differencearray[i][0] > differencearray[j][0]){
swapRows(differencearray, i, j);
}
}}

Permalänk
Medlem

Bra!

Du ser, du är inte så korkad som du trodde för en timme sedan!

Permalänk
Skrivet av blackcoffee:

Anledningen till att alla rekommenderas använda färdiga algoritmer är för att det blir bättre i praktiken. Men nu ska ni ju inte skriva praktiskt användbar kod utan lära er förstå hur det funkar. Om ni nu inte har lärare som gett er resurserna nog att klara det ni ska så är det ju trist.

Jag ger ett tips till: Bubble sort. Det är en algoritm som är lätt att förstå även om den är ansedd som dålig eftersom den är långsam när man ska sortera många tal:

Bubble sort illustrerad:

https://www.youtube.com/watch?v=xli_FI7CuzA

När du fattat vad videon säger kan du sen enkelt googla efter kod som implementerar Bubble Sort i Java. Nästa steg är att byta från att sortera enskilda nummer till att byta plats på raderna i din matris istället.

Missa inte denna pärla från 80 talet

Permalänk
Medlem
Skrivet av filosofis:

Missa inte denna pärla från 80 talet
https://www.youtube.com/watch?v=HnQMDkUFzh4

KLASSIKER!!!!

Något modernare variant: