最近一个需求里面需要实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自写排序算法(升序)的更多相关文章

  1. mfc动态演示排序算法

    实现的排序算法 冒泡排序.选择排序.快速排序 具体实现 选用mfc中的单文档框架 ①SetTimer函数的用法. ②使用画笔画直线. ③使用FillSolidRect()函数覆盖某一矩形区域内的内容: ...

  2. 排序算法(C语言+Python版)宝宝再也不怕面试官写排序算法了

    直接插入排序 过程: 1. 数据可分看成两个部分,前面的数据是有序的 2. 从后面的数据取出一个元素,插到前面有序数据的合适位置 从右端开始查找,到找到比此元素大的时候,则此元素向后移动,以空出多余的 ...

  3. 优雅的python 写排序算法

    arr=[] while True: #输入数据 当输入q结束 a=raw_input() if a=="q": break arr.append(int(a)) s=len(ar ...

  4. 用python写排序算法

    希尔排序 希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能.这样可以让一个元素可以一次性地朝最终位置前进一大步.然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到 ...

  5. C#实现(递归和非递归)高速排序和简单排序等一系列排序算法

        本人由于近期工作用到了一些排序算法.就把几个简单的排序算法.想冒泡排序,选择排序,插入排序.奇偶排序和高速排序等整理了出来,代码用C#代码实现,而且通过了測试.希望能给大家提供參考.     ...

  6. JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)

    1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...

  7. 排序算法的总结——Java实现

    前言 简单归纳一下最近学习的排序算法,如果有什么错误的地方还请大家指教. 本文介绍了七种经典排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序,并且讨论了各种算法的进一 ...

  8. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

  9. 排序算法总结(一)插入排序【Insertion Sort】

    最近在忙着找工作,以前看的排序算法都忘记了,悲剧啦T  T现在来回顾一下吧. 这边推荐一个算法可视化的网站,非常有用.http://visualgo.net/ 一.插入排序的思想(Wikipedia) ...

随机推荐

  1. spring security +spring boot 自定义 403 页面

    用的spring security  做的权限控制, 当  访问没有权限, 跳转 会跳到默认403 页面.不符合当前项目需求. 一下是解决方式: package com.ycmedia; import ...

  2. 教你Mac OS系统四种改动Hosts文件的方法

    使用Mac OS X系统的用户.在某些时候可能遇到了须要改动系统Hosts文件的情况,那么Mac OS系统怎样改动Hosts文件呢?和Windows系统有何差别呢?我们知道事实上改动Hosts文件仅仅 ...

  3. spring beans源码解读之--BeanFactory进化史

    BeanFactory是访问bean容器的根接口,它是一个bean容器的基本客户端视图. 先让我们看看beanfactory的前生后世吧! beanFactory有四个重要的子接口: SimpleJn ...

  4. iOS--NSAttributedString使用介绍

    iOS–NSAttributedString使用介绍 原文见: http://www.itnose.net/detail/6177538.html http://***/html/topnews201 ...

  5. Programming a Spider in Java 源码帖

    Programming a Spider in Java 源码帖 Listing 1: Finding the bad links (CheckLinks.java) import java.awt. ...

  6. Android(java)学习笔记197:常用的对话框

    一.常见对话框属性: 1. AlertDialog.Builder属性  • setTitle: 为对话框设置标题 :• setIcon : 为对话框设置图标:• setMessage: 为对话框设置 ...

  7. 蓝牙代理报错:invalid handle error

    错误症状: -(void)peripheral:(CBPeripheral *)peripheral didUpdateNotificationStateForCharacteristic:(CBCh ...

  8. Navicat Premium 自动备份mysql和sqlserver

    mysql篇: 1.点击计划 2.点击新建处理作业 3.选择需要备份的数据库,上级可用任务 4.点击保存按钮,输入保存文件名 5.保存后点击设置计划任务 6.计划里新建保存时间,应用后输入系统密码即可 ...

  9. java开发webservice的几种方式(转载)

    webservice的应用已经越来越广泛了,下面介绍几种在Java体系中开发webservice的方式,相当于做个记录. 1.Axis2方式 Axis是apache下一个开源的webservice开发 ...

  10. Android Animation学习 实现 IOS 滤镜退出动画

    IOS的用户体验做的很好,其中一点很重要的地方就是动画效果. 最近在学习Android的Animation,简单实现了一个IOS相机滤镜退出的动画: 布局文件:activity_animation_d ...