nikosvas Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Γειά σας καταρχήν. Έχω μία εργασία να κάνω τον bubbleshort στον οποίο μετά από κάθε loop να μειώνεται ο αριθμός των συγκρίσεων και να υπάρχει ένας φρουρός έτσι ώστε όταν δεν υπάρχει swap να σταματά ο αλγόριθμος. Τον τρέχω και δεν κάνει σωστά την ταξινόμιση. Μήπως φταίει η Boolean μεταβλητή swap? > include <stdio.h> #include <stdbool.h> #define SIZE 10 void bubblesort(int pin[],int n); int main() { int a[size]= {12,1,3,4,2,19,40,8,5,5}; printf("Before sorting"); for(int i=0;i<SIZE;i++) { printf(" value %d index %d \n",a[i],i); }//END FOR bubblesort(a,SIZE); printf("After sorting"); for(int i=0;i<SIZE;i++) { printf(" value %d index %d \n",a[i],i); } //END FOR } //END MAIN void bubblesort(int pin[],int n) { int i; int j; bool swap=true; int temp; for(i=0; swap && i<n-1;i++) { swap=false; } for(j=0;j<n-i-1;j++) if(pin[j]>pin[j+1]) { temp=pin[j]; pin[j]=pin[j+1]; pin[j+1]=temp; swap=true; } }
akisk Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Στην 1η for του bubblesort τι ακριβώς κάνεις; Δεν είναι απαραίτητη η χρήση boolean μεταβλητής. >void bubblesort(int pin[],int n) { int j; int t = -1; //πλήθος εναλλαγών σε κάθε πέρασμα int temp; while(i >= 2 && t != 0) { t = 0; for (j = 1; j < n; j++) { if (pin[j] > pin[j+1]) { temp = pin[j]; pin[j] = pin[j+1]; pin[j+1] = temp; t++; } } n--; } }
nilosgr Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 (επεξεργασμένο) Κατ αρχήν δεν είναι quicksort. Κατά δεύτερον στη βιβλιοθήκη stdbool δεν ορίζεται ο τύπος bool ορίζεται κάποιος άλλος (που καλύτερα να τον 'ανακαλύψεις' μόνος σου). Το bool δουλεύει επειδή είναι στη C++ Ο κώδικας δεν λειτουργεί σωστά επειδή δεν έχεις βάλει αγκύλες {} εκεί που πρέπει... Επεξ/σία 20 Μαρτίου 2012 από nilosgr
Star_Light Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Κατ αρχήν δεν είναι quicksort. Κατά δεύτερον στη βιβλιοθήκη stdbool δεν ορίζεται ο τύπος bool ορίζεται κάποιος άλλος (που καλύτερα να τον 'ανακαλύψεις' μόνος σου). Το bool δουλεύει επειδή είναι στη C++ Ο κώδικας δεν λειτουργεί σωστά επειδή δεν έχεις βάλει αγκύλες {} εκεί που πρέπει... Σωστα στην stdbool ο _Bool ορίζεται. (C99) > #include<stdio.h> #include<stdbool.h> int main(void) { _Bool x= 5; printf("x is %d\n" , x); // Boolean 0 or 1 value only.On this case print 1 return 0; }
migf1 Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Και ο bool ορίζεται στο <stdbool.h> (ως macro που γίνεται expand σε _Bool). Οπότε μπορεί κάλλιστα να χρησιμοποιηθεί αντί για _Bool
nilosgr Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Και ο bool ορίζεται στο <stdbool.h> (ως macro που γίνεται expand σε _Bool). Οπότε μπορεί κάλλιστα να χρησιμοποιηθεί αντί για _Bool Ειχα την εντπωση οτι ηταν BOOL
migf1 Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 BOOL ορίζεται στο Win32 API (windef.h) ... ίσως μπερδεύτηκες από εκεί
Star_Light Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Ειχα την εντπωση οτι ηταν BOOL Και παλι ομως.... η C δεν ειναι case sensitive? http://en.wikipedia.org/wiki/Case_sensitivity edit: Άκυρο
migf1 Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Case-sensitive είναι, δεν έχει όμως να κάνει με αυτό που συζητάμε (το BOOL είναι custom defined type).
Anubis13 Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Αυτο ειναι bubblesort και ακομα και με το guard γυρναει σε N^2 Ενας τροπος να υλοποιησεις το guard ειναι int flag = 0; flag = 1; και οπου χρειαζεται αναλογος ελεγχος.
akisk Δημοσ. 20 Μαρτίου 2012 Δημοσ. 20 Μαρτίου 2012 Κατ αρχήν δεν είναι quicksort. Κατά δεύτερον στη βιβλιοθήκη stdbool δεν ορίζεται ο τύπος bool ορίζεται κάποιος άλλος (που καλύτερα να τον 'ανακαλύψεις' μόνος σου). Το bool δουλεύει επειδή είναι στη C++ Ο κώδικας δεν λειτουργεί σωστά επειδή δεν έχεις βάλει αγκύλες {} εκεί που πρέπει... Βασικά απλώς λείπει το # στο πρώτο define του. Αυτο ειναι bubblesort και ακομα και με το guard γυρναει σε N^2 Ενας τροπος να υλοποιησεις το guard ειναι int flag = 0; flag = 1; και οπου χρειαζεται αναλογος ελεγχος. Περίπου αυτό του έδειξα στο 2ο ποστ με την μεταβλητή t που μετράει τις εναλλαγές! Πάντως στο best case scenario θέλει Ο(Ν)
Anubis13 Δημοσ. 21 Μαρτίου 2012 Δημοσ. 21 Μαρτίου 2012 Βασικά απλώς λείπει το # στο πρώτο define του. Περίπου αυτό του έδειξα στο 2ο ποστ με την μεταβλητή t που μετράει τις εναλλαγές! Πάντως στο best case scenario θέλει Ο(Ν) Ναι μετα ειδα το ποστ σου..Δεν πειραζει εγω ηθελα να δωσω μονο την ιδεα και οχι τον κωδικα. Ποτε δεν μας αρεσει το best-case σεναριο αλλα δεν νομιζω οτι ειναι αλγοριθμικης φυσεως το θεμα παρα μια απλη ασκηση σε C.
nikosvas Δημοσ. 21 Μαρτίου 2012 Μέλος Δημοσ. 21 Μαρτίου 2012 Καταρχήν όπως λέτε είναι βελτιστοποίηση του bubblesort. Τώρα προσπαθώ να προσθέσω ένα counter για να μετράει τα swaps. Πιστεύετε όπως το έκανα είναι σωστό? Επίσης θέλω να αξιολογήσω τους αλγορίθμους insertion sort, quicksort και bubblesort. Το πρόβλημα είναι ότι όταν τρέχω τους αλγορίθμους για 1.000.000 στοιχεία μου "κρασάρει" το πρόγραμμα. Τι πιστέυετε ότι φτάει? > #include <stdbool.h> #include <stdio.h> #define SIZE 10 int bubblesort(int pin[],int n,int swapCounter); int main() { int swapCounter=0; int var; int a[size]= {12,1,3,4,2,19,40,8,5,5}; printf("Before sorting"); for(int i=0;i<SIZE;i++) { printf(" value %d index %d \n",a[i],i); }//END FOR var= bubblesort(a,SIZE,swapCounter); printf("After sorting"); for(int i=0;i<SIZE;i++) { printf(" value %d index %d \n",a[i],i); } //END FOR printf("bubble sort makes %d swaps",var); } //END MAIN int bubblesort(int pin[],int n,int swapC) { int i; int j; bool swap=true; int temp; for(i=0; swap && i<n-1;i++) { swap=false; for(j=0;j<n-i-1;j++) if(pin[j]>pin[j+1]) { //arxizei swap temp=pin[j]; pin[j]=pin[j+1]; pin[j+1]=temp; ++swapC; //telos swap swap=true; }//end if }//end for return swapC; } Όπως όρισα την συνάρτηση quicksort > int quicksort (int a[], int lo, int hi,int swapC) //to swapC einai counter { // lo is the lower index, hi is the upper index // of the region of array a that is to be sorted int i=lo, j=hi, h; // comparison element x int x=a[(lo+hi)/2]; // partition do { while (a[i]<x) i++; while (a[j]>x) j--; if (i<=j) { h=a[i]; a[i]=a[j];//swaping a[j]=h; ++swapC; i++; j--; } } while (i<=j); // recursion if (lo<j) quicksort(a, lo, j,swapC); if (i<hi) quicksort(a, i, hi,swapC); return swapC; } Όπως όρισα τον insertion sort > int insertionSort(int pin[],int n,int swapC) { int j; int i; int temp; for(j=1;j<n;j++) { i=j-1; temp=pin[j]; while((temp<pin[i]) && (i>=0)) {//arxiei swap pin[i+1]=pin[i]; i--; ++swapC; }//end while }//end for return swapC; }
migf1 Δημοσ. 21 Μαρτίου 2012 Δημοσ. 21 Μαρτίου 2012 ... Επίσης θέλω να αξιολογήσω τους αλγορίθμους insertion sort, quicksort και bubblesort. Το πρόβλημα είναι ότι όταν τρέχω τους αλγορίθμους για 1.000.000 στοιχεία μου "κρασάρει" το πρόγραμμα. Τι πιστέυετε ότι φτάει? ... Πως τα ορίζεις αυτά τα 1.000.000 στοιχεία; Αν τα ορίζεις σε στατικό πίνακα, το πιθανότερο είναι να εξαντλείς το stack-space... δοκίμασε να τα ορίζεις σε πίνακα που τον δημιουργείς δυναμικά με malloc() (και τον κάνεις free() όταν τελειώνεις). ΥΓ. Δεν έχω αυτή τη στιγμή την ευχέρεια να κοιτάξω τον κώδικά σου (συν ότι είναι αλλοπρόσαλλα στοιχισμένος, οπότε δύσκολο να ευκαιρήσω να τον κοιτάξω, γενικώς ) .
nikosvas Δημοσ. 21 Μαρτίου 2012 Μέλος Δημοσ. 21 Μαρτίου 2012 Θα μπορούσες να δείς αυτό το κομμάτι κώδικα? Δεν ξέρω αν έχω εφαρμόσει σωστά την swap. Γιατί θέλω να μετρήσω τα swaps και τον χρόνο που απαιτεί ο κάθε αλγόριθμος για την ταξινόμιση των στοιχείων. > #include <stdbool.h> #include <stdio.h> #define SIZE 10 int bubblesort(int pin[],int n,int swapCounter); int main() { int swapCounter=0; int var; int a[size]= {12,1,3,4,2,19,40,8,5,5}; printf("Before sorting"); for(int i=0;i<SIZE;i++) { printf(" value %d index %d \n",a[i],i); }//END FOR var= bubblesort(a,SIZE,swapCounter); printf("After sorting"); for(int i=0;i<SIZE;i++) { printf(" value %d index %d \n",a[i],i); } //END FOR printf("bubble sort makes %d swaps",var); } //END MAIN int bubblesort(int pin[],int n,int swapC) { int i; int j; bool swap=true; int temp; for(i=0; swap && i<n-1;i++) { swap=false; for(j=0;j<n-i-1;j++) if(pin[j]>pin[j+1]) { //arxizei swap temp=pin[j]; pin[j]=pin[j+1]; pin[j+1]=temp; ++swapC; //telos swap swap=true; }//end if }//end for return swapC; }
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα