Αναζήτηση και ταξινόμηση

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Ταξινόμηση

Ταξινόμηση με παρεμβολή

Ταξινόμηση με επιλογή

Ταξινόμηση με αντιμετάθεση

Ταξινόμηση με διαμερισμό και αντιμετάθεση

Παράδειγμα

Το παρακάτω παράδειγμα ταξινομεί το πίνακα ακεραίων ivals και τυπώνει το αποτέλεσμα:
#include <stdlib.h>
#include <stdio.h>

/*
 * Integer compare function (passed to qsort)
 */
static int
icmp(const void *arg1, const void *arg2)
{
	return (*(int *)arg1 - *(int *)arg2);
}

main()
{
	int ivals[] = {100, 5, 6, 2, 8, 3, 45, 23};
	int i;

	qsort((void *)ivals, sizeof(ivals) / sizeof(int), sizeof(int), icmp);
	for (i = 0; i < sizeof(ivals) / sizeof(int); i++)
		printf("%d\n", ivals[i]);
}

Αναζήτηση

Σειριακή αναζήτηση

Δυαδική αναζήτηση

Παράδειγμα

Το παρακάτω παράδειγμα διαβάζει μια γραμμή και την τυπώνει σύμφωνα με το διεθνές φωνητικό αλφάβητο (π.χ. για τη γραμμή HELLO WORLD θα τυπώσει:
Hotel
Echo
Lima
Lima
Oscar
Whiskey
Oscar
Romeo
Lima
Delta
/*
 * Read a line from the standard input and print it according to the
 * international phonetic alphabet.
 *
 * Diomidis Spinellis.  March 1999.
 *
 * $Id$
 *
 */

#include <stdlib.h>
#include <stdio.h>

/*
 * The international phonetic alphabet (sorted)
 */
char *names[] = {
	"Alpha",
	"Bravo",
	"Charlie",
	"Delta",
	"Echo",
	"Foxtrot",
	"Golf",
	"Hotel",
	"India",
	"Juliet",
	"Kilo",
	"Lima",
	"Mike",
	"November",
	"Oscar",
	"Papa",
	"Quebec",
	"Romeo",
	"Sierra",
	"Tango",
	"Uniform",
	"Victor",
	"Whiskey",
	"X-Ray",
	"Yankee",
	"Zulu",
};

/*
 * Bsearch compare function
 */
static int
namecmp(char **a, char **b)
{
	return (**a - **b);
}

main()
{
	char buff[80], *p, **name;

	fgets(buff, sizeof(buff), stdin);
	for (p = buff; *p; p++)
		if (name = (char **)bsearch(&p, names, 26, sizeof(char *), namecmp))
			printf("%s\n", *name, *name);
}

Βιβλιογραφία

Ασκήσεις

Άσκηση 6

  1. Να υλοποιηθεί σε C πρόγραμμα το οποίο διαβάζει ονόματα και τηλέφωνα μέχρι να συναντήσει το όνομα "ΤΕΛΟΣ". Στη συνέχεια, για κάθε επόμενο όνομα που διαβάζει, τυπώνει το αντίστοιχο τηλέφωνο, ή τη λέξη ΑΓΝΩΣΤΟΣ αν δεν υπάρχει. Το πρόγραμμα να υλοποιηθεί με τη χρήση των qsort και bsearch.

    Παράδειγμα:

    Γιάννης
    031343454
    Φανή
    027354566
    Θανάσης
    014645678
    Αλέξανδρος
    56789
    Γεωργία
    034556789
    ΤΕΛΟΣ
    Σωτήρης
    ΑΓΝΩΣΤΟΣ
    Φανή
    027354566
    

    Σημείωση: Η σύγκριση για τη λέξη "ΤΕΛΟΣ" μπορεί να γίνει ως εξής:
    if (strcmp(buff, "END\n") == 0) ...