Anubis13 Δημοσ. 6 Ιανουαρίου 2014 Δημοσ. 6 Ιανουαρίου 2014 #include <stdio.h> #include <stdlib.h> typedef struct column { int a; int b; } pair; int binarySearch( pair const x[], int left, int right, int key){ if (right < left) return -1; int mid = (left + right) / 2; /*left + (right - left)/2;*/ if (key == x[mid]. return mid; return binarySearch(x, (key>x[mid]. ? (mid + 1) : left, (key>x[mid]. ? right : (mid - 1), key); } int main(int argc, char **argv) { int n = 4; int i; pair digits[4] = { { 1, 2 }, { 2, 3 }, { 3, 1 }, { 4,0 } }; int position[4]; for (i = 0; i < n; i++) { position[i] = binarySearch(digits, 0, n, digits[i].; printf("%d\n", position[i]); } return 0; } To προβλημα ειναι οτι ακομα και αν του περναω απο το struct το b δεν κανει match με το b αλλα με το a. Γιατι?
albNik Δημοσ. 6 Ιανουαρίου 2014 Δημοσ. 6 Ιανουαρίου 2014 Δεν εχω καταλαβει καλα αλλα δεν τα εχεις ταξινομημένα κατα b (2 3 1 0). Στο binarysearch πρεπει να ειναι ταξινομημενα.
Anubis13 Δημοσ. 6 Ιανουαρίου 2014 Μέλος Δημοσ. 6 Ιανουαρίου 2014 Εχεις δικιο απλα το εγραψα απο αλλο προγραμμα που εχω και τα σορταρω ως προς b. Αλλα δεν μου δουλευει. Βασικα θα τεσταρω κατι στο προγραμμα μου και θα επανελθω. #include <stdio.h> #include <stdlib.h> typedef struct column { int a; int b; } pair; int compare(const void *v1, const void *v2) { const pair *p1 = (pair *)v1; const pair *p2 = (pair *)v2; if (p1->b > p2-> return 1; if (p1->b < p2-> return -1; return 0; } int binarySearch( pair const x[], int left, int right, int key){ if (right < left) return -1; int mid = (left + right) / 2; /*left + (right - left)/2;*/ if (key == x[mid]. return mid; return binarySearch(x, (key>x[mid]. ? (mid + 1) : left, (key>x[mid]. ? right : (mid - 1), key); } int main(int argc, char **argv) { int n = 4; int i; pair digits[4] = { { 1, 2 }, { 2, 3 }, { 3, 1 }, { 4,0 } }; pair digits2[4] = { { 1, 2 }, { 2, 3 }, { 3, 1 }, { 4,0 } }; qsort(digits, n, sizeof(digits[0]), compare); for (i = 0; i < n; i++) { //position[i] = binarySearch(digits, 0, n, digits2[i].; printf("%lld %lld\n", digits[i].a, digits[i].; } int position[4]; for (i = 0; i < n; i++) { position[i] = binarySearch(digits, 0, n, digits2[i].; printf("%lld\n", position[i]); } return 0; } Ουτε αυτο ομως δουλευει σωστα. 3 2 0 1 δεν επρεπε να ειναι η σειρα?
imitheos Δημοσ. 6 Ιανουαρίου 2014 Δημοσ. 6 Ιανουαρίου 2014 Ουτε αυτο ομως δουλευει σωστα. 3 2 0 1 δεν επρεπε να ειναι η σειρα? Δεν κοίταξα καθόλου τον κώδικα οπότε ίσως το σκεπτικό σου είναι σωστό αλλά μου φαίνεται ότι δουλεύει σωστά. Με ποιο σκεπτικό πιστεύεις ότι θα έπρεπε να δώσει 3 2 0 1 ? int main(int argc, char **argv) { pair digits[4] = { { 1, 2 }, { 2, 3 }, { 3, 1 }, { 4,0 } }; pair digits2[4] = { { 1, 2 }, { 2, 3 }, { 3, 1 }, { 4,0 } }; ......... for (i = 0; i < n; i++) { printf("Will search for %d\n", digits2[i].; position[i] = binarySearch(digits, 0, n, digits2[i].; printf("%lld\n", position[i]); } } Η έξοδος που παίρνω είναι η εξής: 4 0 3 1 1 2 2 3 Εδώ έχουμε τον πίνακα digits μετά την ταξινόμηση και βλέπουμε ότι όντως έχει ταξινομηθεί κατά το b. Will search for 2 2 Will search for 3 3 Will search for 1 1 Will search for 0 0 Εδώ τρέχει η bsearch που ψάχνει το b του πίνακα digits2. Στην αρχή ψάχνει το πρώτο στοιχείο του πίνακα digits2 το οποίο είναι το 2 και στον ταξινομημένο πίνακα digits βρίσκεται στην θέση 2 (digits[0].b=0, digits[1].b=0, digits[2]=2) οπότε το αποτέλεσμα που σου δίνει είναι σωστό. Το ίδιο γίνεται και για τα επόμενα.
Anubis13 Δημοσ. 6 Ιανουαρίου 2014 Μέλος Δημοσ. 6 Ιανουαρίου 2014 Εχεις δικιο τρεχει σωστα, αλλα δεν μπορω να το κανω να τρεξει σωστα στο αλλο μου προγραμμα. Ειμαι βλακας μεγατονων και θα πρεπει να μαθω να ονομαζω σωστα της μεταβλητες μου
defacer Δημοσ. 6 Ιανουαρίου 2014 Δημοσ. 6 Ιανουαρίου 2014 Επίσης καλό θα ήταν να μάθεις να αποφεύγεις τέτοιες εξυπνάδες: return binarySearch(x, (key>x[mid]. ? (mid + 1) : left, (key>x[mid]. ? right : (mid - 1), key); Ο μελλοντικός σου εαυτός θα σε ευχαριστεί. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα