hatte die Aufgabe verschiedene Arrays zu erzeugen. Mit den Größen
10
100
1000
10000
100000
1000000
Dazu sollte ich prüfen wie lange jeweils der Quicksort braucht um die Arrays zu sortieren.
Habe mir das also folgendermaßen vorgestellt:
PHP Code:
void zeit(){
long int i;
printf("\t Quicksort\n");
for(i=10; i<=1000000; i*=10){
xl=i;
generieren();
time_t vorher=time(NULL);
quick_sort(daten);
time_t nachher=time(NULL);
printf("%d \t %d \n", i, (int)(nachher-vorher));
}
}
Wie man die Zeit angeblich misst, wurde uns vom Professor in einem Bsp. gezeigt.
xl ist die Länge des Arrays.
Hab erst gedacht es liegt daran, das der Datentyp int zu klein ist, da die Zahlen ja bis 1Million gehen.
Also alle relevanten Ints mal auf long int geändert.
Aber folgender Fehler bleibt nach wie vor:
Code:
0 [main] Praktikum4 4564 open_stackdumpfile: Dumping stack trace to Praktikum4.exe.stackdump
zeig mal kompletten src und was fürn compiler du benutzt.
außerdem ist time nicht für solche zeitmessungen geeignet, da sie nur im sekundenbereich arbeitet, selbst mit 1mio elementen wird quicksort vermutlich unter 1 sekunde bleiben.
Wozu long int? int auf x86 architekturen hat 32bit. 2^32 = 4294967296 abs values (unsigned). signed entsprechend ~ hälfe (positiv), was locker ausreicht.
Fehler ist ein Stack Overflow, sprich du initialisierst wahrscheinlich ein Array mit size i auf dem Stack. Der Stack ist begrenzt. Sowas macht man auf dem Heap:
int *iArray = new int[1000000];
PS.: An welcher Wald und Wiesen Hochschule.... Mathematische Komplexität? Argh.
bin mir zu 99% sicher, dass das nicht sein problem ist, da er in der funktion anscheinend auf das array als globale zugreift und man ein array nicht dynamisch in einer funktion auf dem stack allokieren kann (zmdst mit C sprachmitteln), deswegen wie ich jetzt zum 3. mal schreibe soll er mal den gesamten source rausrücken und sagen welchen compiler/ide/os er benutzt.
Und damit nicht auf dem Stack, sondern im Data-Segment.
Ein Array muss eine Compile-Zeit-Konstante als Größe haben, ergo kann er i ohnehin in keinem Fall nutzen, um das Array zu erzeugen.
Das ginge, wie du schon erkannt hast,nur auf dem Heap.
Und btw. ist new kein C.
Quote:
Originally Posted by ilovenoodles
@Dr. Coxxy: Das wird so nicht laufen. Legst auch 10^7 integer aufn Stack...
Nein. Klugscheißen will gelernt sein.
Übrigens ist es nicht korrekt, dass int notwendigerweise 32bit hat, da liegt der TE schon richtig.
Wenn er Werte bis zu 4 mrd speichern will, braucht er plattformunabhängig mindestens einen long. Int wird es auf den meisten Plattformen allerdings auch tun.
Hab nie behauptet das new zu C gehört. Und Compile-Zeit-Konstante hasse resch, würde nur mit nem define laufen.
Quote:
Originally Posted by MrSm!th
Übrigens ist es nicht korrekt, dass int notwendigerweise 32bit hat, da liegt der TE schon richtig.
Wenn er Werte bis zu 4 mrd speichern will, braucht er plattformunabhängig mindestens einen long. Int wird es auf den meisten Plattformen allerdings auch tun.
void qs(int daten[][yl], int links, int rechts) { int i,j; int x,y,z;
i=links; j=rechts; x = daten[(links+rechts)/2][1]; // mittleres Element
do { while (daten[i][1]<x && i<rechts) i++; // such Element für "große Klasse" while (x<daten[j][1] && j>links) j--; // such Element für "kleine Klasse"
if (i<=j) { // vertausche Elemente y = daten[i][1]; //zahl zwischenspeichern z = daten[i][0]; //index zwischenspeichern daten[i][1] = daten[j][1]; daten[i][0] = daten[j][0]; daten[j][1] = y; daten[j][0] = z; i++; j--; } } while (i<=j);
if (links<j) qs(daten, links,j); // Aufruf für "kleine Klasse" if (i<rechts) qs(daten, i, rechts); // Aufruf für "große Klasse"
}
/** * Diese Funktion bereitet den Aufruf der Rekursiven "qs" * Funktion vor. * * Der Parameter "daten" enthält die Daten, die sortiert * werden sollen. */ void quick_sort(int daten[][yl]) { // Quicksort vorbereiten int zaehler;
Um nochmal bisschen weiter zu klugscheißen: Die Wörter Heap und Stack sind nicht passend. Der Standard gibt nicht vor, wo die Variablen und Objekte letzendlich landen, sondern nur wie diese sich zu verhalten haben bezüglich ihrer Gültigkeit.
Ein Array muss eine Compile-Zeit-Konstante als Größe haben, ergo kann er i ohnehin in keinem Fall nutzen, um das Array zu erzeugen.
Das ginge, wie du schon erkannt hast,nur auf dem Heap.
Ich dachte, in C gäbe es VLAs?
Quote:
Originally Posted by MrSm!th
Übrigens ist es nicht korrekt, dass int notwendigerweise 32bit hat, da liegt der TE schon richtig.
Wenn er Werte bis zu 4 mrd speichern will, braucht er plattformunabhängig mindestens einen long. Int wird es auf den meisten Plattformen allerdings auch tun.
Vorzeichen beachten. Oder einfach stdint.h einbinden und uint_least32_t oder uint_fast32_t verwenden.
Quote:
Originally Posted by Schlüsselbein
Um nochmal bisschen weiter zu klugscheißen: Die Wörter Heap und Stack sind nicht passend. Der Standard gibt nicht vor, wo die Variablen und Objekte letzendlich landen, sondern nur wie diese sich zu verhalten haben bezüglich ihrer Gültigkeit.
Und laut Standard heißen sie:
Quote:
Originally Posted by §6.2.4
There are four storage durations: static, thread, automatic, and allocated.
[C] Quicksort mit Int funktioniert nicht bei großen Zahlen 12/07/2013 - C/C++ - 3 Replies Hey,
ich musste ein bestimmtes Array erzeugen, dieses mit Quicksort sortieren, und dann sortiert ausgeben.
Wir hatten einen vorgebenen Quicksort für Chars. Den sollten wir nur eben für int anpassen.
Habe also die paar "char" durch "int" ersetzt.
Habe mir dann erst ein Testarray erstellt mit kleinen Zahlen:
Bsp:
int daten={5,4,3,2,1};
Ausgabe:
Koopa's Discount-Offer:Ectos 13,99€/stack! Lpicks 3,99/stack! 04/04/2012 - Guild Wars Trading - 0 Replies Hey ;)
My special offer until monday or sold-out. Enjoy :)
Ectos in stock:
10 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png
8 stacks sold
1 Stack = 13,99€
Koopas Special -> Ektos für 15/€ Stack -- Dietriche 4,99€/Stack 04/03/2012 - Guild Wars Trading - 1 Replies Servus ;)
Ich biete euch hier die einmalige Gelegenheit, Ektos und Dietriche zu einem sehr günstigen Preis zu kaufen.
Ektos auf Lager:
15 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png
1 Stack = 15,00€