Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.
#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. Γιατι?

Δημοσ.

Εχεις δικιο απλα το εγραψα απο αλλο προγραμμα που εχω και τα σορταρω ως προς 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 δεν επρεπε να ειναι η σειρα?

Δημοσ.

Ουτε αυτο ομως δουλευει σωστα. 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) οπότε το αποτέλεσμα που σου δίνει είναι σωστό. Το ίδιο γίνεται και για τα επόμενα.
Δημοσ.

Εχεις δικιο τρεχει σωστα, αλλα δεν μπορω να το κανω να τρεξει σωστα στο αλλο μου προγραμμα.

 

Ειμαι βλακας μεγατονων και θα πρεπει να μαθω να ονομαζω σωστα της μεταβλητες μου :P

Δημοσ.

Επίσης καλό θα ήταν να μάθεις να αποφεύγεις τέτοιες εξυπνάδες:

return binarySearch(x, (key>x[mid]. ? (mid + 1) : left, (key>x[mid]. ? right : (mid - 1), key);

Ο μελλοντικός σου εαυτός θα σε ευχαριστεί.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...