浅谈PHP源码二十六:PHP快速排序源码实现的简化

浅谈PHP源码二十六:PHP快速排序源码实现的简化

内容导读

收集整理的这篇技术教程文章主要介绍了浅谈PHP源码二十六:PHP快速排序源码实现的简化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2175字,纯文字阅读大概需要4分钟

内容图文

这篇文章主要介绍了关于浅谈PHP源码二十六:PHP快速排序源码实现的简化,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

浅谈PHP源码二十六: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 ifbegin = 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中文网!

相关推荐:

浅谈PHP 源码二十五:关于next,current,key函数

浅谈PHP源码二十四 :iterator实现中当值为false时无法完成迭代的原因分析

以上就是浅谈PHP源码二十六:PHP快速排序源码实现的简化的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的浅谈PHP源码二十六:PHP快速排序源码实现的简化全部内容,希望文章能够帮你解决浅谈PHP源码二十六:PHP快速排序源码实现的简化所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。


本文关键词:

联系我们

在线咨询:点击这里给我发消息

邮件:w420220301@qq.com