| |
|
|
p.specht
| Weil physisches sortieren en Datenbanken heutzutage mega-out es, hier mi Versión uno Quicksort-basierten en- o. absteigenden INDEXERS como Proc. (En Datenbanken dauert physisches Sortieren simplemente viel demasiado tiempo. Neue Einträge voluntad por lo tanto al Ende angefügt y lediglich el Index adaptado. Ähnlich simplemente es entonces logisches Löschen: Man überspringt el entsprechenden Index simplemente en el Verlinkungsliste)
Anmerkung: Der einleitende Hauptteil dient lediglich el Zeitnehmung. Binnen 3 Sekunden dejar se en Float-Arrays compiliert rund 9600 Indexe aufsteigend o. 9100 Indexierungen absteigend erzeugen. Der Algorithmus debería relativ ligeramente en Stringarrays a modifizieren ser, wobei el Leistung natürlich algo sinken se.
Título de la ventana " Quickdex, el QuickSort-Up/Down Indexer"
'(CL) CopyLeft 2014-10 by P.Pájaro carpintero, Wien; sin jede Gewähr!
'{Quickdex, una QuickSort-Up/Down Indexer para kleine Datenbestände
'----------------------------------------------------------------------------------------
' Dieser Hauptteil se el Tiempo para linear ansteigende Element-Anzahl zeigen...
Ventana de Estilo 24:Ventana 0,0-%maxx,%maxy-40
declarar n&,x![],y![],k![],v&[],xm!,ym!,tm&:Conjunto("decimals",17):randomize
Test:
n&=n& + 100'<< Inkrement el Elemente-Anzahl (para Testen des Zeitverhaltens)
':::imprimir "\n Setup de ";n&,"zu sortierenden Random-Floatwerten se ejecuta..."
clear x![],y![],k![],v&[],xm!,ym!:setSize x![],n&:setsize y![],n&
x![]=rnd(height(%hwnd)):y![]=rnd(height(%hwnd))
':::Imprimir " Indexier-Kriterium se producido ..."
setsize k![],n&'Sortierkriteriums
setsize v&[],n&'Ergebnis: Index para cada einzelne Sortierkriteriums-Element
' Schwerpunkt
whileloop 0,n&-1:xm!=xm!+x![&Loop]:ym!=ym!+y![&Loop]:endwhile :xm!=xm!/n&:ym!=ym!/n&
' Kriterium sei el Punkt-Distanz para Schwerpunkt
whileLoop 0,n&-1:k![&Loop]=sqr(x![&Loop]-xm!)+sqr(y![&Loop]-ym!):endwhile'Kriterium k![]
'----------------------------------------------------------------------------------------
':::imprimir " Indexiervorgang comenzó... "
'tm&=&gettickcount:v&[]=QuickIndexUp9600(k![])
tm&=&gettickcount:v&[]=QuickIndexDwn9100(k![])
'----------------------------------------------------------------------------------------
tm&=&gettickcount-tm&:set("decimals",3)':Título de la ventana str$(tm&/1000)+" sec":sound 2000,200
:::imprimir " Indexieren von",n&,"Elementen final en "+str$(tm&/1000)+" sec":set("decimals",17)
':waitinput 10000
whileloop 0,n&-1
'::: imprimir tab(3);right$(" "+str$(&Loop),6);tab(17);format$("%g",k![v&[&Loop]]);
'::: imprimir tab(40);format$("%g",x![v&[&Loop]]);tab(70);format$("%g",y![v&[&Loop]])
'----------------------------------------------------------------------------------------
'2 PRÜFZEILEN GEBEN ALARM WENN SORTIERUNG NICHT ...<..aufsteigend ...>..absteigend:
if &bucle>1:if k![v&[&Loop]] > k![v&[&Loop-1]]:Imprimir "\n *** PRÜFREIHENFOLGE FALSCH! *** "
sound 2000,500:waitinput :endif :endif
'----------------------------------------------------------------------------------------
endwhile'::: waitinput 60000
GOTO "Test"
'}
proc QuickIndexUp9600 :parámetros a![]:declarar n&,p&,l&,r&,s&,sl&[],sr&[],w!,t&,x!,i&,j&,v&[]
n&=sizeof(a![]):setsize v&[],n&:v&[]=&Index:s&=1:sl&[1]=0:sr&[1]=n&-1
mientras que s&>0:l&=sl&[s&]:r&=sr&[s&]:s&=s&-1:mientras que l&<r&:i&=l&:j&=r&:p&=(l&+r&)\2
if a![v&[l&]]>a![v&[p&]] :t&=v&[l&]:v&[l&]=v&[p&]:v&[p&]=t&:endif
if a![v&[l&]]>a![v&[r&]] :t&=v&[l&]:v&[l&]=v&[r&]:v&[r&]=t&:endif
if a![v&[p&]]>a![v&[r&]] :t&=v&[p&]:v&[p&]=v&[r&]:v&[r&]=t&:endif :x!=a![v&[p&]]
mientras que i&<=j&:mientras que a![v&[i&]]<x!:inc i&:endwhile :mientras que x!<a![v&[j&]]:dec j&:endwhile
if i&<=j&:t&=v&[i&]:v&[i&]=v&[j&]:v&[j&]=t&: inc i&:dec j&:endif :endwhile
if (j&-l&)<(r&-i&):if i&<r&:s&=s&+1:sl&[s&]=i&:sr&[s&]=r&:endif :r&=j&:más
if l&<j&:s&=s&+1:sl&[s&]=l&:sr&[s&]=j&:endif :l&=i&:endif :endwhile :endwhile :volver v&[]
ENDPROC
proc QuickIndexDwn9100 :parámetros a![]:declarar n&,p&,l&,r&,s&,sl&[],sr&[],w!,t&,x!,i&,j&,v&[]
n&=sizeof(a![]):s&=1:setsize v&[],n&:v&[]=&index:s&=1:sl&[1]=0:sr&[1]=n&-1
mientras que s&>0:l&=sl&[s&]:r&=sr&[s&]:s&=s&-1:mientras que l&<r&:i&=l&:j&=r&:p&=(l&+r&)\2
if a![v&[l&]]>a![v&[p&]]:t&=v&[l&]:v&[l&]=v&[p&]:v&[p&]=t&:endif
if a![v&[l&]]>a![v&[r&]]:t&=v&[l&]:v&[l&]=v&[r&]:v&[r&]=t&:endif
if a![v&[p&]]>a![v&[r&]]:t&=v&[p&]:v&[p&]=v&[r&]:v&[r&]=t&:endif :x!=a![v&[p&]]
mientras que i&<=j&:mientras que a![v&[i&]]>x!:inc i&:endwhile :mientras que x!>a![v&[j&]]:dec j&:endwhile
if i&<=j&:t&=v&[i&]:v&[i&]=v&[j&]:v&[j&]=t&:inc i&:dec j&:endif :endwhile
if (j&-l&)<(r&-i&):if i&<r&:inc s&:sl&[s&]=i&:sr&[s&]=r&:endif :r&=j&:más
if l&<j&:inc s&:sl&[s&]=l&:sr&[s&]=j&:endif :l&=i&:endif :endwhile :endwhile :volver v&[]
ENDPROC
|
|
|
| Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 30.04.2021 ▲ |
|
|
|