Dieser Artikel stellt hauptsächlich den PHP-Quellcode 26 vor: Vereinfachung der PHP-Schnellsortierungs-Quellcode-Implementierung. Jetzt kann ich ihn mit Ihnen teilen
Kurze Diskussion zum PHP-Quellcode 26: Vereinfachung der PHP-Quellcode-Implementierung für die schnelle Sortierung
Während dieser Zeit überprüfte ich die Datenstruktur und sah Sortierung und klassische Schnellsortierung
Also beschloss ich, es zu tun Schauen Sie sich die Implementierung der Sortierung in PHP an. Im Zend-Verzeichnis können wir die Datei zend_qsort.c und die Datei zend_qsort.h sehen.
Dies ist die Datei, in der PHP die schnelle Sortierung implementiert.
Aus dem Code können wir das Sehen Sie, dass es möglicherweise mit einer Vielzahl von Datentypen kompatibel ist, daher sind seine Austausch- und Vergleichspositionen komplizierter und es scheint komplizierter zu sein. Deshalb habe ich alle Typen in
in den Typ int geändert und einen erhalten vereinfachte Version der Schnellsortierung
im PHP-Quellcode Der Code lautet wie folgt:
#include <stdio.h> static qsort_swap(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp;} void qsort(int *base, int nmemb){ int *begin_stack[10]; int *end_stack[10]; int *begin; int *end; int *seg1; int *seg2; int *seg2p; int loop; unsigned int offset; /* 使用栈而不是常见的递归实现 */ begin_stack[0] = base;//开始元素位置栈,入栈 end_stack[0] = base + (nmemb - 1) ;//结束位置栈,入栈 for (loop = 0; loop >= 0; --loop) { begin = begin_stack[loop];//开始位置出栈 end = end_stack[loop];//结束位置出栈 while (begin < end) { offset = (end - begin) >> 1;//取中间位置 qsort_swap(begin, begin + offset);//交换开始和中间的位置 seg1 = begin; seg2 = end; while (1) { for (; seg1 < seg2 && *begin < *seg1 ; seg1 += 1); for (; seg2 >= seg1 && *seg2 > *begin; seg2 -= 1); if (seg1 >= seg2) break; qsort_swap(seg1, seg2); } qsort_swap(begin, seg2); seg2p = seg2; if ((seg2p - begin) <= (end - seg2p)) { if (seg2p < end) {//右侧入栈 begin_stack[loop] = seg2p + 1; end_stack[loop++] = end; } end = seg2p; } else { if (seg2p > begin) {// 左侧入栈 begin_stack[loop] = begin; end_stack[loop++] = seg2p - 1; }//end if begin = seg2p; }//end if }//end while }//end for }int main(int argc, char *argv[]){ int a[10] = {14, 5, 7, 8, 2, 4, 55, 3}; int i; qsort(a, 8); for (i = 0; i < 8;i++) { printf("%d ", a[i]); } return 0;}
Nachdem ich das gelesen habe, habe ich das Gefühl: Leistungsstarke Zeiger sind ein großer Vorteil!
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Eine kurze Diskussion zum PHP-Quellcode 25: Über die nächsten, aktuellen Schlüsselfunktionen
Das obige ist der detaillierte Inhalt vonEine kurze Diskussion des PHP-Quellcodes 26: Vereinfachung der PHP-Quick-Sort-Quellcode-Implementierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!