找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2394|回复: 15

[分享] AcArry 排序,写了个模板

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2016-11-27 23:32:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 aeo 于 2016-11-27 23:50 编辑

Acarray 没有排序函数,转来转去太麻烦
写了一个模板,以后可以和数组 qsort排序一样。
用了最简单的快速排序,(qsort速度是不稳定的)

  1. typedef int(*Cmp_Void_Void)(const void *a,const void *b );
复制代码


[sell]
  1. template <typename T> void qsort_AcArray(AcArray<T> &arr,int m, int n ,Cmp_Void_Void Cmp){
  2.         int ix,j,k;
  3.         T key;
  4.         if( m < n)
  5.         {
  6.                 k = (m + n)/2;
  7.                 arr.swap(m,k);
  8.                 key = arr[m];
  9.                 ix = m+1;
  10.                 j = n;
  11.                 while(ix <= j)
  12.                 {
  13.                         while((ix <= n) &&  Cmp ( & arr[ix],& key)==-1 )
  14.                                 ix++;
  15.                         while((j >= m) &&  Cmp ( & arr[j],& key)==1  )
  16.                                 j--;
  17.                         if( ix < j)
  18.                                 arr.swap(ix,j);
  19.                 }
  20.                 arr.swap(m,j);
  21.                 qsort_AcArray(arr,m,j-1,Cmp);
  22.                 qsort_AcArray(arr,j+1,n,Cmp);
  23.         }
  24. }
[/sell]

比较函数:
这是论坛里面的:

  1. //返回值参考qsort
  2. int XXXXX( const void *a , const void *b ) ;
  3. int XXXXXX( const void *a , const void *b )
  4. {
  5.         return *(double *)a > *(double *)b ? 1 : -1;
  6. }

复制代码






论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-11-27 23:46:13 | 显示全部楼层
本帖最后由 aeo 于 2016-11-27 23:53 编辑

实例不想写了,
调研方法和数组 的qsort一样:

qsort_AcArray( your_Array,0, your_Array.length()-1,XXXXX);

=================================
谁有更快速的排序方法,可以改进

----------------------------------------------
发代码真麻烦,老是有丢失的,特殊字符后面一定要留空格!!!!
但是代码多时,不可能一个个改
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-11-28 00:00:37 | 显示全部楼层
付费的人多,就发 适宜点表的排序函数

就是和lisp一样
(qsort_AcArray array  "xYz"); 版本,用大小写区分上下左右排序.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2016-11-28 06:00:00 来自手机 | 显示全部楼层
AcArray用的就是vector,且提供了asArrayPtr(),vector有默认sort()方法,主要的是自己根据类型写Cmp
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2016-11-28 08:02:58 | 显示全部楼层
CAD也可以排序呀,真是强大。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 382个

财富等级: 日进斗金

发表于 2016-11-28 08:17:48 | 显示全部楼层
学习学习,有时间试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2016-11-28 11:41:12 | 显示全部楼层

排序是程序语言具体算法上的一个很重要的操作,一个是排序,一个是查找,数据结构都专门开篇讲的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2016-11-28 11:43:17 | 显示全部楼层
感谢版主提供源码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-11-28 16:31:24 | 显示全部楼层

不是白写的,主要是为了3楼说的功能。hehe

当然std的排序对很大的数组是优化的,快;
一般用用差不多,太多的时候不在意速度。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2016-11-28 19:38:19 | 显示全部楼层
么有分,谁能送我点积分啊::>_<::
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-11-30 22:59:09 | 显示全部楼层
本帖最后由 aeo 于 2016-11-30 23:19 编辑

再来:

  1. void qsortPointArray(AcGePoint3dArray pts,CString cmpstr){
  2.                         qsort_AcArray( pts,0,pts.length()-1,cmp_2Point,&cmpstr);
  3.                 }

复制代码


左上-》右下排点表:
AcGePoint3dArray pts;
                .......
CString cmpstr = _T("xYz");
qsortPointArray(pts, cmpstr);


======================================================
比较 函数:::

  1. bool cmp_2Point (const void* pp1,const void* pp2,const void* str){
  2.         AcGePoint3d *p1 = (AcGePoint3d*)pp1;
  3.         AcGePoint3d *p2 = (AcGePoint3d*)pp2;
  4.         CString cmpstr = *(CString*)str;
  5.         if (p1->x != p2->x)
  6.                 return  acutWcMatch(cmpstr, _T("x*") )== RTNORM? p1->x > p2->x : p1->x < p2->x ;
  7.         else if (p1->y != p2->y)
  8.                 return  acutWcMatch(cmpstr, _T("?y*") )== RTNORM? p1->y > p2->y : p1->y < p2->y;
  9.         else
  10.                 return  acutWcMatch(cmpstr, _T("*z") )== RTNORM? p1->z > p2->z : p1->z < p2->z;
  11. }

复制代码


======================================
最关键的重写的排序模板:
[sell]

  1. template <typename T> void qsort_AcArray(AcArray<T> &arr,int m, int n ,Cmp_Void_Void_Void Cmp,void* thirdParm){

  2.         int i,j,k;
  3.         T key;
  4.         if( m < n)
  5.         {
  6.                 k = (m + n)/2;
  7.                 arr.swap(m,k);
  8.                 key = arr[m];
  9.                 i = m+1;
  10.                 j = n;
  11.                 while(i <= j)
  12.                 {
  13.                         while((i <= n) && !Cmp( & arr[ i ],&key,thirdParm))
  14.                                 i++;
  15.                         while((j >= m) && Cmp( & arr[j],&key,thirdParm) )
  16.                                 j--;
  17.                         if( i < j)
  18.                                 arr.swap(i,j);
  19.                 }
  20.                 arr.swap(m,j);
  21.                 // 递归地对较小的数据序列进行排序
  22.                 qsort_AcArray(arr,m,j-1,Cmp,thirdParm);
  23.                 qsort_AcArray(arr,j+1,n,Cmp,thirdParm);
  24.         }
  25. }

复制代码

[/sell]
比如有人要对曲线上的点排序,第三参数可以是 曲线。
qsortPointArray(pts,pCmp, pCurve);把参数带进去






仔细想没什么用 hehe

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2016-12-1 11:37:08 | 显示全部楼层
typedef int(*Cmp_Void_Void_Void)(const void *a,const void *b ,const void *c);
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

发表于 2016-12-5 16:50:34 | 显示全部楼层
谢谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 28个

财富等级: 恭喜发财

发表于 2018-7-19 20:58:07 来自手机 | 显示全部楼层
看看看看看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2226个

财富等级: 金玉满堂

发表于 2020-5-21 00:10:33 | 显示全部楼层

谢谢楼主分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-21 23:34 , Processed in 0.337034 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表