最近一个需求里面需要实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. 【Android - MD】之CoordinatorLayout的使用

    CoordinatorLayout是Android 5.0新特性--Material Design中的一个布局控件,主要用来协调各个子视图之间的工作,也可以用来作为顶部布局.CoordinatorLa ...

  2. iOS开发总结-搜索功能实现--使用SKTag

    TagsTableViewController.h 文件 #import <UIKit/UIKit.h> #import "personSearch.h" @inter ...

  3. 【POJ3182】The Grove BFS 最短路径周围

    意甲冠军:给定一个N*M图.,间'X'代表树木(树木必须汇集到森林,非分离),然后,'.'它代表的空间.'*'它代表的起点.现在它需要从起点.一圈,最后回到起点,所经过最少点数. 题目中给的'+'就是 ...

  4. spin_lock &amp; mutex_lock的差别?

    本文由该问题引入到内核锁的讨论,归纳例如以下 为什么须要内核锁? 多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是能够訪问全部内核数据的,因此要对共享数据进行保护,即相互排斥处理 有 ...

  5. limit-进程句柄限制

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可 ...

  6. 在GDB 中如何记录 instruction-history and function-call-history

    (EDIT: per the first answer below the current "trick" seems to be using an Atom processor. ...

  7. linux_2.6内核内存缓冲与I/O调度机制:

    http://blog.csdn.net/kaiwii/article/details/7030178 到底是BIO还是BH?答案是BIO与BH

  8. eclipse 常见问题及解决

    1. Target runtime Apache Tomcat v6.0 is not defined.错误解决方法 原文:http://blog.csdn.net/xw13106209/articl ...

  9. java面试32问

    第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements ...

  10. css(display,float,position)

    display 用来设置元素的显示方式 display : block | none | inline | inline-block inline:指定对象为内联元素 block:指定对象为块元素 i ...