工作总结: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) ...
随机推荐
- C# ArrayList 基本用法 分类: C# 2014-09-26 11:03 524人阅读 评论(0) 收藏
首先说明一下ArrayList 与 数组的区别: (1)ArrayList 的容量可以根据需要自由扩充,数组的容量是固定的 (2)ArrayList 只能是一维形式,数组可以是多维的 (3)Array ...
- jquery 的小角落
最近换了工作,在这家公司里,使用了大量的jQuery,闲来无事看看锋利的jQuery,发现好多边边角角的选择器,却能省去一大堆逻辑上的的代码,废话不多说直接上代码. #### jquery 对象与do ...
- 常用iptables规则整理
1.仅允许内部合法的IP地址访问服务器 #setting access rules #one,in access rules,allow all the ips of hudong.com iptab ...
- Memo打印1
Delphi 打印Memo里面的内容 实现的功能和记事本的打印的功能一样 打印保存为文件时此时的文件名如何设置? 当Memo里的文本数量巨大时 窗体正在打印会出现点数字显示问题 闪 ...
- Android 颜色渲染(四) BitmapShader位图渲染
版权声明:本文为博主原创文章,未经博主允许不得转载. Android 颜色处理(四) BitmapShader位图渲染 public BitmapShader(Bitmap bitmap,Shad ...
- List<T>分组一
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- MapReduce输出格式
针对前面介绍的输入格式,MapReduce也有相应的输出格式.默认情况下只有一个 Reduce,输出只有一个文件,默认文件名为 part-r-00000,输出文件的个数与 Reduce 的个数一致. ...
- 移动端 设置 小于12px 字体 初探
1.移动端字号规范 2. 百度字号调研 3. 绕过12px 限制 4. 缩放 5. chrome 字号
- Java-Android 之输入提示框
Android的文本提示框有两种方式: main.xml文件 <?xml version="1.0" encoding="utf-8"?> < ...
- 将MVC中的Controllers、Model和View分别放到单独的项目中
Model: 新建-项目-Windows-类库 MVCTest.Model Controller:新建-项目-Windows-控制台应用程序 MVCTest.Bussiness Views:新建-项目 ...