2686|1

22

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

转发个选择排序算法的实现 [复制链接]

//ChoiceSort.h
/*
filename: ChoiceSort.h
author:
description: Choice sort  functions
date: 20130113
All Rights Reserved
*/


#ifndef CHOICE_SORT_H_
#define CHOICE_SORT_H_


        #ifdef __cplusplus
                extern "C"
                {
        #endif

                        //#include "..\..\Shared\App\CommonMecroFun.h"
                        #ifndef TYPE_DEFINE_
                        #define TYPE_DEFINE_
                                typedef unsigned long  ULONG32;
                                typedef long           LONG32;
                                typedef signed long    SLONG32;
                               
                                typedef unsigned int   UINT32;
                                typedef int            INT32;
                                typedef signed int     SINT32;
                               
                                typedef unsigned short UINT16;
                                typedef short          INT16;
                                typedef signed short   SINT16;

                               
                                typedef unsigned char  UINT8;
                                typedef char           INT8;
                                typedef signed char    SINT8;
                        #endif

                        #ifndef NULL
                                #ifdef  __cplusplus
                                        #define NULL    0
                                #else
                                        #define NULL    ((void *)0)
                                #endif
                        #endif





                        typedef enum SortOrder_
                        {
                                eUpOrder,        // up order      升序排列
                                eDownOrder,        //down order   降序排列
                        }eSortOrder;

                        /*
                                if  *Low < *High, and return eUpOrder,       up order will be
                                if  *Low < *High, and return eDownOrder,  down order will be
                                if  *Low > *High, and return eUpOrder,       down order will be
                                if  *Low > * High, and return eDownOrder,  up order will be
                        */
                        typedef eSortOrder (*Order)(void* Low, void* High);

                        typedef enum SortStatus_
                        {
                                eSortNullPt,// Null pointer
                                eSortZeroNum,//the number of source is 0, no data to sort
                                eSortZeroSize,//the size of member is 0, error
                                eSortOK,//para is OK
                        }eSortStatus;
                       

                       
                        typedef struct Array_
                        {
                                UINT32 Num;      //the members of a array        //数组成员的数目
                                UINT32 Size;     //the size of  a member,in byte        //数组成员的大小,以字节为单位
                                void * BaseAddr; //the beginnig address of a array        //数组的开始地址
                        }Array;

                        #define SET_ARRAY_PROPERTY(Property, Array) \
                                do{\
                                        (Property).Num = ARRAY_LEN(Array);\
                                        (Property).Size = sizeof(Array[0]);\
                                        (Property).BaseAddr = Array;\
                                }while(0)
                                       
                        eSortStatus ChoiceSort(const Array *pAryProperty, Order SortOrder);
       
        #ifdef __cplusplus
                }
        #endif


#endif


//ChoiceSort.c
#include "ChoiceSort.h"


static eSortStatus ChkChoiceSortPara(const Array *pAryProperty)
{
        if((NULL==pAryProperty) || (NULL==pAryProperty->BaseAddr))
        {
                return (eSortNullPt);
        }

        if(0 == pAryProperty->Num)
        {
                return (eSortZeroNum);
        }

        if(0 == pAryProperty->Size)
        {
                return (eSortZeroSize);
        }

        return (eSortOK);
}


UINT8 *StrNSwap(UINT8* Des, UINT8* Src, UINT32 n)
{
        UINT32 i = 0;
        register UINT8 Tmp = 0;
       
        if((NULL==Des) || (NULL==Src))
        {
                return (NULL);
        }

        for(i=0; i         {
                Tmp = *Src;
                *Src = *Des;
                *Des = Tmp;

                Src++;
                Des++;
        }

        return (Src);
}




eSortStatus ChoiceSort(const Array *pAryProperty, Order SortOrder)
{
        #define VOID_PT_ADD_INT(Pt, Num) ((void*)((UINT32)(Pt) + (UINT32)(Num)))
       
        UINT32 i = 0;
        UINT32 j = 0;
        UINT32 MoreLittleOrBigIdx = 0;

        UINT32 Num     = 0;//the number of members of a array
        UINT32 Size    = 0; //the size of a member of a array
        void* BaseAddr = NULL;//the base address of array

        //check para
        eSortStatus eStatus = eSortNullPt;
        eStatus = ChkChoiceSortPara(pAryProperty);

        if(eStatus != eSortOK)
        {
                return (eStatus);
        }

       
        Num      = pAryProperty->Num;
        Size     = pAryProperty->Size;
        BaseAddr = pAryProperty->BaseAddr;

        //sort
        for(i=0; i         {
                MoreLittleOrBigIdx = i;
               
                for(j=MoreLittleOrBigIdx+1; j                 {
                        // find the more less or bigger data
                        if(eDownOrder == SortOrder(VOID_PT_ADD_INT(BaseAddr, Size*MoreLittleOrBigIdx), VOID_PT_ADD_INT(BaseAddr, Size*j)))
                        {
                                MoreLittleOrBigIdx = j;
                        }
                }

                if(MoreLittleOrBigIdx != i)// if we find the more less or bigger data, then swap it and array
                {
                        StrNSwap(VOID_PT_ADD_INT(BaseAddr, Size*i), VOID_PT_ADD_INT(BaseAddr, Size*MoreLittleOrBigIdx), Size);
                }
        }

        return (eSortOK);
}



大家评论一下吧。
此帖出自编程基础论坛

最新回复

代码中应该多一些注释 呵呵  详情 回复 发表于 2013-3-1 14:09
点赞 关注
 

回复
举报

280

帖子

0

TA的资源

纯净的硅(中级)

沙发
 
代码中应该多一些注释 呵呵
此帖出自编程基础论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表