Maison  >  Article  >  développement back-end  >  Une brève discussion du code source PHP vingt-six : Simplification de l'implémentation du code source de tri rapide PHP

Une brève discussion du code source PHP vingt-six : Simplification de l'implémentation du code source de tri rapide PHP

不言
不言original
2018-06-28 18:01:361697parcourir

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 :

Une brève discussion sur le code source PHP vingt-cinq : à propos des fonctions clés suivantes et actuelles

Une brève discussion du code source PHP vingt-quatre : analyse des raisons pour lesquelles l'itération ne peut pas être terminée lorsque la valeur est fausse dans l'implémentation de l'itérateur

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn