工作总结:MFC自写排序算法(升序)
最近一个需求里面需要实IP升序排序,用了qsort,结果是内部排序,甚至感觉排序结果不可预测性,于是自己写了一个外部排序。
需求如下:一个指针里面有N条记录,每条记录包含:IP,偏移地址,保留位,均占4个字节,且这N条记录需要按照升序排序。
算法如下:
for (int i = ; i < m_nCount; i++ )//sort
{
DWORD dwPre = NULL;//pCurAddr.GetIP()+i
DWORD dwNex = NULL;
char cTemp[] = {};
char cTemp2[] = {};
for (int j = m_nCount - ; j >= i; j--)
{
memcpy(&dwPre, pLCIndexBuf+ ((j-)*), );
memcpy(&dwNex, pLCIndexBuf+(j*), );
if (dwNex > dwPre)
{
memcpy(&cTemp, pLCIndexBuf + (j*), );
memcpy(&cTemp2, pLCIndexBuf + ((j-)*), );
memcpy(pLCIndexBuf + (j*), cTemp2, );
memcpy(pLCIndexBuf + ((j-)*), cTemp, );
}
}
}
最后大家讨论,上述方法存在问题:
1.冒泡排序非最优,二分较好;
2.memcpy函数使DWORD类型IP倒序未做处理
最后还是用了qsort函数,上次使用qsort函数导致排序错误是由于下面黄色标记代码出错原因
代码如下:
qsort(&pLCIndexBuf[], m_nCount, , CompareAMTIndexV6); int CompareAMTIndexV6(const void *a,const void *b)
{
//CAddr pCurAddr;
DWORD pOne = *(DWORD*)a;
DWORD pTwo = *(DWORD*)b; //first section of IP Address
BYTE byTemp1 = LOBYTE(LOWORD(pOne));
BYTE byTemp2 = LOBYTE(LOWORD(pTwo));
if (byTemp1 != byTemp2)
{
return ((int)byTemp1 - (int)byTemp2);
} //Second section of IP Address
byTemp1 = HIBYTE(LOWORD(pOne));
byTemp2 = HIBYTE(LOWORD(pTwo));
if (byTemp1 != byTemp2)
{
return ((int)byTemp1 - (int)byTemp2);
} //Third section of IP Address
byTemp1 = LOBYTE(HIWORD(pOne));
byTemp2 = LOBYTE(HIWORD(pTwo));
if (byTemp1 != byTemp2)
{
return ((int)byTemp1 - (int)byTemp2);
} //Fourth section of IP Address
byTemp1 = HIBYTE(HIWORD(pOne));
byTemp2 = HIBYTE(HIWORD(pTwo));
if (byTemp1 != byTemp2)
{
return ((int)byTemp1 - (int)byTemp2);
} return *(int*)a - *(int*)b;//升序
}
工作总结:MFC自写排序算法(升序)的更多相关文章
- mfc动态演示排序算法
实现的排序算法 冒泡排序.选择排序.快速排序 具体实现 选用mfc中的单文档框架 ①SetTimer函数的用法. ②使用画笔画直线. ③使用FillSolidRect()函数覆盖某一矩形区域内的内容: ...
- 排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了
直接插入排序 过程: 1. 数据可分看成两个部分,前面的数据是有序的 2. 从后面的数据取出一个元素,插到前面有序数据的合适位置 从右端开始查找,到找到比此元素大的时候,则此元素向后移动,以空出多余的 ...
- 优雅的python 写排序算法
arr=[] while True: #输入数据 当输入q结束 a=raw_input() if a=="q": break arr.append(int(a)) s=len(ar ...
- 用python写排序算法
希尔排序 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到 ...
- C#实现(递归和非递归)高速排序和简单排序等一系列排序算法
本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考. ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
- 排序算法的总结——Java实现
前言 简单归纳一下最近学习的排序算法,如果有什么错误的地方还请大家指教. 本文介绍了七种经典排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序,并且讨论了各种算法的进一 ...
- 排序算法总结------选择排序 ---javascript描述
每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...
- 排序算法总结(一)插入排序【Insertion Sort】
最近在忙着找工作,以前看的排序算法都忘记了,悲剧啦T T现在来回顾一下吧. 这边推荐一个算法可视化的网站,非常有用.http://visualgo.net/ 一.插入排序的思想(Wikipedia) ...
随机推荐
- javascript 函数参数
1.javascript函数参数的个数以及类型没有强制规定,调用时不必严格按照函数的参数或类型,函数的参数只是在调用函数的时候提供了便利,但不是必须的! 2.参数在javascript内部是用数组ar ...
- zoj 3657 策略题 easy
http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4880 由于是要去牡丹江.是浙大出题,所以找了份浙大的题,第一道水题做的就不顺 ...
- Java编程陷阱-类成员初始化
原文地址:http://blog.csdn.net/veryitman/article/details/6450523 如果你忽略Java的细节,恐怕你的代码会充满bug,下面讨论关于类成员初始化问题 ...
- css 权威指南笔记(二)元素
替换元素 用来替换元素内容的部分并非有文档内容直接表示. img input 非替换元素 其内容由用户代理(通常是一个浏览器)在元素本身生成的框中显示. 块级元素 块级元素生成一个 元素框,(默认)会 ...
- HTML的Get方法URL传递中文参数,解决乱码问题
本例中有使用JQuery. 资料参考:http://www.cnblogs.com/babycool/p/3169058.html 发送的HTML页面代码: <!DOCTYPE html> ...
- sql查询过程中 update,insert,delete可视化收影响行数
insert into test_tb output inserted.id,inserted.data values('c'),('d') delete from test_tb output de ...
- 【转】 NSString什么时候用copy,什么时候用strong
原文: http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有 ...
- Nhibernate 智能提示 以及其他类库智能提示
Nhibernate 的智能提示 Nhibernate.dll 放到以下路径 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framewo ...
- (JAVA)从零开始之--打印流PrintStream记录日志文件
这里的记录日志是利用打印流来实现的. 文本信息中的内容为String类型.而像文件中写入数据,我们经常用到的还有文件输出流对象FileOutputStream. File file = new Fil ...
- ubuntn 虚拟机NAT 静态IP 网络配置
在虚拟机安装ubuntu12.04自动获取IP 一切都没有问题 ssh连接也正常.关机重启后郁闷的发现网络已经不通了,于是开始了以下的摸索. 1.配置静态IP 网关: ip段: 命令: Vim /et ...