Struct sortering med bubblesort
Undrar om någon kan informera hur man sorterar i en struct.
Jag har array[antal].namn och array[antal].försök i samma struct.
Och jag vill sortera efter försök, och kunna skriva ut det sedan.
Är det någon vänlig själ som kan detta?
Mvh
Jan
Svara
Sv: Struct sortering med bubblesort
Om jag förstår rätt:
1 2 3 4 5 6 7 | for ( int i=0; i<antal-1; i++) for ( int j=i+1; j<antal; j++) if (array[i].försök > array[j].försök) swap(array[i].försök, array[j].försök); for ( int i=0; i<antal; i++) cout << array[i].namn << '\t' << array[i].försök << endl; |
Svara
Sv: Struct sortering med bubblesort
Antagligen vill han väl swappa hela structarna och inte bara försökmembern, så nåt sånt här borde väl vara bättre.
1 2 3 4 5 6 7 | for ( int i=0; i<antal-1; i++) for ( int j=i+1; j<antal; j++) if (array[i].försök > array[j].försök) swap(array[i], array[j]); for ( int i=0; i<antal; i++) cout << array[i].namn << '\t' << array[i].försök << endl; |
Svara
Sv: Struct sortering med bubblesort
Tänkte bara tillägga att bubblesort bara ska användas för små datamängder eller för data som redan är i nästan rätt ordning.
För slumpmässiga data har bubblesort en körtid på O(n^2)
Svara
Sv: Struct sortering med bubblesort
Tja... i o m att man naturligtvis använder den inbyggda funktionen sort, så spelar det ju ingen roll, det här verkar vara för att frågeskrivaren vill lära sig principer.
Svara
Sv: Struct sortering med bubblesort
Naturligtvis ska man använda std's sort men jag tänkte bara krydda inlärningen av principerna med lite nyttig teori. Jag sa aldrig att det var fel att använda bubble sort för att lära sig.
Svara
Sv: Struct sortering med bubblesort
Alltså, det är väl sådär man INTE gör bubbelsort. Iofs har jag sett det flera gånger tidigare, men jag fick - en gång i tiden - lära mig att man gör typ såhär:
int i;
int flag=1;
while(flag==1) {
flag=0;
for(i=0;i<antal-1;i++) {
if(array[i].försök > array[i+1].försök) {
swap(array[i], array[i+1]);
flag=1;
}
}
Trots denna ändring är bubbelsort fortfarande långsam, men den är lätt att lära sig (och förstå) iaf. Alltså man går igenom hela array:en för att se om man kan göra (minst) ett byte och om man gjort det så måste man köra ett varv till.
För att skydda sig mot oändliga loopar (pga fel i koden eller månens fas) kan man förstås lägga till en räknare som gör att man hoppar ut tidigare så det aldrig blir fler varv än tidigare nämda kodexempel.
Svara