Cet article présente principalement le code source PHP vingt-six : simplification de l'implémentation du code source de tri rapide PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer
. Brève discussion sur le code source PHP vingt-six : Simplification de l'implémentation du code source du tri rapide PHP
Pendant cette période, j'examinais la structure des données et j'ai vu le tri et le tri rapide classique
J'ai donc décidé de jetez un oeil à l'implémentation du tri en PHP Dans le répertoire Zend, on peut voir le fichier zend_qsort.c et le fichier zend_qsort.h
C'est le fichier où PHP implémente le tri rapide
A partir du code, on peut voyez qu'il peut être compatible avec une variété de types de données, donc ses positions d'échange et de comparaison sont plus compliquées, et cela semble plus enchevêtré, j'ai donc changé tous les types dans
en type int, et j'ai obtenu un version simplifiée du tri rapide
dans le code source PHP. Le code est le suivant :
#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;}
Après avoir lu ceci, j'ai le sentiment : des pointeurs puissants, profitent beaucoup !
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !
Recommandations associées :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!