home *** CD-ROM | disk | FTP | other *** search
- // -------------------------------------
- // SHELLSORT.ADA
- // Shellsort Testprogramm in Ada
- // (C) 1991 R. Fischer & TOOLBOX
- // -------------------------------------
- WITH TEXT_IO; USE TEXT_IO;
- WITH CALENDAR; USE CALENDAR;
- // bit_ops nur in Meridian Ada
- WITH BIT_OPS; USE BIT_OPS;
-
- PROCEDURE shellsor IS // Testprogramm
-
- // Ein/Ausgabe von Zeitsprannen
- PACKAGE duration_io IS
- NEW FIXED_IO(DURATION);
- USE duration_io;
-
- // iarray = unbegrenztes INTEGER Array
- TYPE iarray IS
- ARRAY(INTEGER RANGE <>) OF INTEGER;
-
- startzeit : TIME; // Startzeit des Tests
-
- // Der Test wird 'iterationen' Mal
- // durchgeführt
- iterationen: LONG_INTEGER := 32;
-
- // Es werden bei jedem Durchlauf
- // 'size' Zahlen sortiert
- size : CONSTANT INTEGER := 4000;
-
- // Definition des Sortierfeldes:
- feld : iarray(0..size-1);
-
- // Inline-Prozedur zum Vertauschen
- // zweier Variableninhalte
- PROCEDURE swap(a : IN OUT INTEGER;
- b : IN OUT INTEGER)
- IS
- BEGIN
- a := a XOR b;
- b := b XOR a;
- a := a XOR b;
- END swap;
- PRAGMA INLINE(swap);
-
- // Aufsteigend Sortieren des Arrays v
- PROCEDURE shellsort( v : IN OUT iarray)
- IS
- gap : INTEGER;
- j : INTEGER;
- BEGIN
- gap := (v'LAST+1) / 2;
- WHILE gap > 0 LOOP
- FOR i IN gap..v'LAST LOOP
- j := i-gap;
- WHILE (j>=0) AND THEN
- (v(j)>v(j+gap)) LOOP
- swap(v(j),v(j+gap));
- j := j - gap;
- END LOOP;
- END LOOP;
- gap := gap / 2;
- END LOOP;
- END shellsort;
-
- // Beginn des "Hauptprogramms"
- BEGIN
- startzeit := CLOCK;
- WHILE iterationen > 0 LOOP
- // Feld in inverser Reihenfolge
- // füllen
- FOR i IN feld'RANGE LOOP
- feld(i) := size-i;
- END LOOP;
- // Feld sortieren
- shellsort(feld);
- iterationen := iterationen-1;
- END LOOP;
- // Benötigte Zeit anzeigen
- PUT(CLOCK-startzeit);
- PUT(" Sekunden"); NEW_LINE;
- //--------------------------------------
- // Ende von SHELLSORT.ADA
-
-
-
- // -------------------------------------
- // SHELLSORT.CPP
- // Shellsort Testprogramm in C++
- // (C) 1991 R. Fischer & TOOLBOX
- // -------------------------------------
-
- #include <iostream.h>
- #include <time.h>
-
- const int size=4000; // Größe des Feldes
- static long iterationen=32; //Durchläufe
- int feld[size];
-
- // Vertauschen der Inhalte von a und b
- inline void swap(int& a, int& b)
- { a ^= b; b ^= a; a ^= b; }
-
- // Shellsort - v[0] .. v[n-1] werden
- // aufsteigend sortiert
- // Algorithmus nach:
- // Kernighan/Ritchie,
- // The C Programming Language, 2nd ed.
- void shellsort(int* v, int n)
- { int gap, i,j;
- for(gap=n/2; gap>0; gap /= 2)
- for(i = gap; i < n; i++)
- for(
- j = i-gap;
- j>=0 && v[j]>v[j+gap];
- j -= gap
- )
- swap(v[j],v[j+gap]);
- }
-
- void main(void)
- {
- time_t startzeit = clock();
- while(iterationen--)
- { // Feld initialisieren
- for(int i=0; i<size; i++)
- feld[i] = size-i;
- // Sortieren
- shellsort(feld,size);
- }
- cout << ((clock()-startzeit)/CLK_TCK)
- << "Sekunden\n";
- }
- END;
- //--------------------------------------
- // Ende von SHELLSORT.CPP