この記事では、主に PHP ソース コードの簡略化 26: PHP クイック ソート ソース コードの実装を紹介します。これは、必要な友人に参照していただくために共有します。 # PHP ソース コード 26 についての簡単な説明: PHP クイック ソート ソース コードの実装の簡素化
この期間中、データ構造を見直していたところ、ソートと従来のクイック ソートが目に留まりました。 PHP でのソートの実装を見てみることにしました。 Zend ディレクトリには、zend_qsort.c ファイルと zend_qsort.h ファイルがあります。
ここに、PHP でクイック ソートを実装するためのファイルがあります。私たちはコードを見ると様々なデータ型に対応していることが分かりますので、交換位置や比較位置がより複雑になり、より複雑になりそうなので、
内の型をすべてint型に変更しました。 PHP ソース コードにクイック ソートの簡易バージョンが含まれています
コードは次のとおりです:
#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;}
PHP ソース コード 25 についての簡単な説明: 次の現在の主要な関数について
簡単な説明 PHP ソース コード 24: イテレーターの実装で値が false の場合に反復を完了できない理由の分析
以上がPHP ソース コードの簡単な説明 26: PHP クイック ソート ソース コードの実装の簡略化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。