MTK优美代码赏析6:电话本里的快速排序和插入排序算法

MTK优美代码赏析6:电话本里的快速排序和插入排序算法
记得读书的时候学数据结构和一些程序基础的课程,学了很多的排序算法,当时感觉蛮有趣,也很简单,当大学的教育是以理论为主的,哪些教授们又没给咱举个实用的例子说明为什么要教我们这个,所以考完试就把这些没用的东东给忘了...
最近为了实现自己的一个应用不得已去啃电话本,竟然发现里面有一个简单的不错的排序算法,只所以不错,是因为他所处架构的位置和作用我很清楚,但其内部的代码逻辑竟然一时没有看懂,汗!
当然电话本里排序的算法很多。这只是其中一个例子...
1.首先补习一下排序算法的基础,下班回家我在网上找了关于排序的资料,算法描述的很简单,但可能因为自己即将失业的缘故吧,有个别例子自己竟一时也没看懂,头大...希望各位看客不要象我一样荒废了大学交的学费啊!
冒泡排序
http:
//baike.baidu.com/view/254413.htm
快速排序算法
http:
//baike.baidu.com/view/19016.htm
插入排序
http:
//baike.baidu.com/view/396887.htm

 

   2.然后看一看这个电话本排序算法的背景.电话本是任何的手机都应该具备的最基本的功能,他本身的存储和管理就已经比较复杂,还需要和通话,短信等联系在一起构成完整的系统,这里讲的就是里面最简单的需求:来电或来短信使要显示电话本里对应的姓名.

我们用的MTK平台又是如何实现这一需求的呢?写到这里就要从MTK电话本开机初始化写起,见网址http://blog.sina.com.cn/s/blog_64a85b990100hbiy.html.
mmi_phb_ind_startup_read时系统逐一获得l4层给的电话本数据(SIM卡和手机里存的数据格式是一致的,都只存姓名和号码),通过mmi_phb_startup_read_entry写入PhoneBook[MAX_PB_ENTRIES]中,并用g_phb_name_index[MAX_PB_ENTRIES]来存储L4里对应号码索引store_index,用PhoneBookEntryCount来存储读出来的总数
读取完成后,mmi_phb_init_build_lookup_table里的mmi_phb_op_increase_lookup_table函数将从手机和sim卡中读取出来得姓名和号码插入将号码转化为数字的LookUpTable[MAX_LOOKUP_TABLE_COUNT]中
mmi_phb_init_populate_lookup_table,每隔500毫秒读取一次手机电话本内存储的号码拓展信息(公司号码,家庭号码等),并将有效的号码也转化为数字存入LookUpTable[MAX_LOOKUP_TABLE_COUNT]中.
LookUpTable的出现很好的解决了来信息来电话显示号码对应姓名的问题,系统将这个结构数组以号码转化的数字(截取后几位,程序里可以指定这个位数)进行排序(今天讲的排序就是这个排序)

typedef 
struct
{
    U16 store_index;    
/* Store Index of Phonebook, Begin from 0 */
    U32 number;
} MMI_PHB_LOOKUP_NODE_STRUCT;

   3.   通过获取来电号码,将来点号码转化为数字,然后在 LookUpTable中进行比对获取对应store_index,通过找到store_index在g_phb_name_index中的位置找到PhoneBook[MAX_PB_ENTRIES]中对应的姓名

   LookUpTable加速了系统号码的匹配,MTK系统必须保持这个数组的排序性.系统在完成拓展号码读取后即用mmi_phb_lookup_table_sort进行对LookUpTable的排序.实际上对电话本的每一次增删改操作系统都会调用mmi_phb_lookup_table_sort对LookUpTable进行排序.

  作者:张素丰,转载请注明出处:http://www.cnblogs.com/zhangsufeng/archive/2010/09/26/1836353.html 

   4.下面看排序代码

  
//先看其切换节点的函数
/*
****************************************************************************
 * FUNCTION
 *  mmi_phb_lookup_table_swap_node
 * DESCRIPTION
 *  Swaps the look-up table nodes
 * PARAMETERS
 *  i       [IN]        
 *  j       [IN]        
 * RETURNS
 *  void
 ****************************************************************************
*/
void mmi_phb_lookup_table_swap_node(U16 i, U16 j)
{
    
/*----------------------------------------------------------------*/
    
/* Local Variables                                                */
    
/*----------------------------------------------------------------*/
    MMI_PHB_LOOKUP_NODE_STRUCT temp;

    
/*----------------------------------------------------------------*/
    
/* Code Body                                                      */
    
/*----------------------------------------------------------------*/
    memcpy(
&temp, &LookUpTable[i], sizeof(MMI_PHB_LOOKUP_NODE_STRUCT));
    memcpy(
&LookUpTable[i], &LookUpTable[j], sizeof(MMI_PHB_LOOKUP_NODE_STRUCT));
    memcpy(
&LookUpTable[j], &temp, sizeof(MMI_PHB_LOOKUP_NODE_STRUCT));
}

//排序的main函数
/*
****************************************************************************
 * FUNCTION
 *  mmi_phb_lookup_table_sort
 * DESCRIPTION
 *  Sorts the look-up table
 *  
 *  This is a fast Quick-Sort as suggested by
 *  Pluto. It will perform insertion sort for
 *  array chunks of size less than 4 and quick
 *  sort for size greater than 4.
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 ****************************************************************************
*/
void mmi_phb_lookup_table_sort(void)
{
    
/*----------------------------------------------------------------*/
    
/* Local Variables                                                */
    
/*----------------------------------------------------------------*/

    
/*----------------------------------------------------------------*/
    
/* Code Body                                                      */
    
/*----------------------------------------------------------------*/
    
if (g_phb_cntx.lookup_table_count)//该标记纪录LookUpTable使用的实际长度
    {
        
/* Set to zero beore sorting, check if this flag larger than phonebook entries to see if finish sorting. */
        g_phb_cntx.populate_count 
= 0;//该标记纪录是否完成排序,为0xffff时完成排序

        
/* Begin to sort. */
        
//先用一次快速排序,在完成排序后,前端和后段中间一段各有6个元素没有排序
        mmi_phb_lookup_table_quicksort(0, (U16) (g_phb_cntx.lookup_table_count - 1));
        
//再用一次插入排序,主要对没有排序的那段排序
        mmi_phb_lookup_table_insertionsort(0, (U16) (g_phb_cntx.lookup_table_count - 1));

        
/* After sorting, set it to total phonebook entries. */
        g_phb_cntx.populate_count 
= 0xffff;//完成排序
    }
}


//快速排序
/*
****************************************************************************
 * FUNCTION
 *  mmi_phb_lookup_table_quicksort
 * DESCRIPTION
 *  Sorts the lookup table using quick sort algorithm
 * PARAMETERS
 *  l       [IN]        
 *  r       [IN]        
 * RETURNS
 *  void
 ****************************************************************************
*/
void mmi_phb_lookup_table_quicksort(U16 l, U16 r)
{
    
/*----------------------------------------------------------------*/
    
/* Local Variables                                                */
    
/*----------------------------------------------------------------*/
    U16 i, j;
    U32 pivot;

    
/*----------------------------------------------------------------*/
    
/* Code Body                                                      */
    
/*----------------------------------------------------------------*/
    
if ((r - l) > 4)
    {
        i 
= (r + l) / 2;
        
if (LookUpTable[l].number > LookUpTable[i].number)
        {
            mmi_phb_lookup_table_swap_node(l, i);
        }
        
if (LookUpTable[l].number > LookUpTable[r].number)
        {
            mmi_phb_lookup_table_swap_node(l, r);
        }
        
if (LookUpTable[i].number > LookUpTable[r].number)
        {
            mmi_phb_lookup_table_swap_node(i, r);
        }

        j 
= r - 1;
        mmi_phb_lookup_table_swap_node(i, j);
        i 
= l;
        pivot 
= LookUpTable[j].number;

        
for (;;)
        {
            
do
            {
            } 
while (LookUpTable[++i].number < pivot);
            
do
            {
            } 
while (LookUpTable[--j].number > pivot);

            
if (j < i)
            {
                
break;
            }

            mmi_phb_lookup_table_swap_node(i, j);
        }

        mmi_phb_lookup_table_swap_node(i, (U16) (r 
- 1));
        mmi_phb_lookup_table_quicksort(l, j);
        mmi_phb_lookup_table_quicksort((U16) (i 
+ 1), r);
    }
}

//插入排序
/*
****************************************************************************
 * FUNCTION
 *  mmi_phb_lookup_table_insertionsort
 * DESCRIPTION
 *  Sorts the lookup table using insertion sort algorithm
 * PARAMETERS
 *  lo      [IN]        
 *  hi      [IN]        
 * RETURNS
 *  void
 ****************************************************************************
*/
void mmi_phb_lookup_table_insertionsort(U16 lo, U16 hi)
{
    
/*----------------------------------------------------------------*/
    
/* Local Variables                                                */
    
/*----------------------------------------------------------------*/
    U16 i, j;
    MMI_PHB_LOOKUP_NODE_STRUCT elem;

    
/*----------------------------------------------------------------*/
    
/* Code Body                                                      */
    
/*----------------------------------------------------------------*/
    
for (i = lo + 1; i <= hi; ++i)
    {
        memcpy(
&elem, &LookUpTable[i], sizeof(MMI_PHB_LOOKUP_NODE_STRUCT));

        j 
= i;
        
while (j > lo)
        {
            
if (LookUpTable[j - 1].number <= elem.number)
            {
                
break;
            }
            memcpy(
&LookUpTable[j], &LookUpTable[j - 1], sizeof(MMI_PHB_LOOKUP_NODE_STRUCT));
            j
--;
        }
        memcpy(
&LookUpTable[j], &elem, sizeof(MMI_PHB_LOOKUP_NODE_STRUCT));
    }
}

 

 

posted on 2010-09-26 23:32 Anpher Zhang 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/zhangsufeng/archive/2010/09/26/1836353.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual C++中最常用的类与API函数

这篇文章能让初学者快速了解visual C MFC中常见的核心的类与函数&#xff0c;虽然全部看下来有点枯燥&#xff0c;但对初学者快速了解MFC的框架结构很有好处。 常用类 CArchive类&#xff1a;用于二进制保存档案 CBitmap类&#xff1a;封装Windows的图形设备接口(GDI)位图 CBru…

vim编译器的使用方法(行号、删除、复制、查找等)

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 vim是在Linux环境下的编辑器&#xff0c;它的常见使用操作如下。 1、显示行号 编辑器默认不显示行号&#xff0c;有二种办法可以显示行号。 &#xff08;1&#xff09;第一种是&#xff0c;暂时显示。在vim…

Imagination

Imagination Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8 Accepted Submission(s) : 3 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description There are four matrixs blow ,…

Day19 练习题

1.列举布尔值为False的值 0,[],{},(),False,’’,None 列如&#xff1a; if 0: 2.写函数&#xff1a; 根据范围获取其中被3和7整除的所有数的和&#xff0c;符合条件的数字个数以及符合条件的数字的总和 3.函数传递参数时&#xff0c;是否用的同一内存地址 name “hairui” de…

error U1087: cannot have : and :: dependents for same target

DDK下build -c错误:error U1087: cannot have : and :: dependents for same target 被build的source code所在path不能含有空格. 转载于:https://www.cnblogs.com/vcerror/p/4289079.html

网络通信基础常识

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、网络通信属于进程间通信 进程间通信的一种方法是使用套接字socket&#xff0c;网络通信其实就是位于网络中不同主机上面的2个进程之间的通信。 2、网络通信的层次 网络通信的层次&#xff0c;即…

Android NDK工程创建与编译运行

首发地址&#xff1a;http://www.eoeandroid.com/thread-201993-1-1.html一、 工程创建1. 创建一个Android工程配置好开发环境并加载好对应版本sdk后&#xff0c;选择菜单File->New-> Project创建工程&#xff0c;工程类型选择Android Project&#xff0c;如下图所示&…

[Quatsch]Quantum Or Optics

小生预言&#xff0c;鉴于目前CG产业中学术界与生产界之间的差异&#xff0c;未来必将有一门独立的学科&#xff0c;专门用于研究自然界的材质特性与表现&#xff0c;从此艺术界与学术界将呈现完美之统一&#xff0c;应该先在MIT或者Cornell出现。本人姑且将这门学科命名为“应…

Numbers

表示实数&#xff0c;Lua中没有整数。一般有个错误的看法CPU运算浮点数比整数慢。事实不是如此&#xff0c;用实数代替整数不会有什么误差&#xff08;除非数字大于100,000,000,000,000&#xff09;。Lua的numbers可以处理任何长整数不用担心误差。你也可以在编译Lua的时候使用…

查询命令:find、grep,which、whereis

一、find&#xff0c;查找某个文件的存放路径 find用来查找某个文件的存放位置。即你知道文件名字&#xff0c;但不知道放在哪里。 使用格式&#xff1a;“ find 查找路径 -name "要查找的文件名" ” 使用举例&#xff1a;find /etc -name "interfaces" ro…

C#事件 的讲解

一、事件的本质事件是软件系统里的两个子系统之间&#xff0c;或者两个模块之间&#xff0c;或者两个对象之间发送消息&#xff0c;并处理消息的过程。在面向对象的世界里&#xff0c;就可以统一认为是两个对象之间的行为。两个对象之间发送的这种消息&#xff0c;对发送方来讲…

phpMyAdmin密码设置

2019独角兽企业重金招聘Python工程师标准>>> 在使用phpMyAdmin操作数据库时&#xff0c;首先需要设置mysql的root用户的密码。具体操作参考前一篇博文。设置完mysql的root密码之后&#xff0c;需要对phpMyAdmin的登录进行一些配置。 未经配置的phpMyAdmin很不安全&a…

openjdk:8u22-jre-alpine在java开发中的NullPointerException错误解决方案

问题描述 ** 在SpringBoot项目中使用了Ureport报表组件, 打包发布部署到docker中启动报错 ** java.lang.NullPointerExceptionat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:…

例程:Linux下的socket演示程序2

本程序完成学生信息注册功能&#xff08;将学生信息存放到服务器&#xff09;。 服务器端&#xff1a; #include <stdio.h> #include <arpa/inet.h> #include <string.h> #include <sys/types.h> /* See NOTES */ #include <sys/socket.…

关于VC++6.0中getline函数的一个bug

关于VC6.0中getline函数的一个bug 最近在调试程序时&#xff0c;发现getline函数在VC6.0和其他编译器上运行结果不一样&#xff0c;比如有如下这段程序&#xff1a; #include <iostream> #include <string>using namespace std;int main(void) {string str;getline…

Nagios添加主机监控失败-故障小结

如果在/usr/local/nagios/etc/object 下自建hosts.cfg和services.cfg文件定义主机和服务后&#xff0c;在web界面只能查看到localhost主机&#xff0c;而看不到所要检测主机&#xff0c;这时候就要查看有没有在/usr/local/nagios/etc/nagios.cfg文件中加入自建文件hosts.cfg和s…

postgresql 数据表【转】

原文&#xff1a;http://www.cnblogs.com/stephen-liu74/archive/2011/12/16/2290803.html 一、表的定义&#xff1a; 对于任何一种关系型数据库而言&#xff0c;表都是数据存储的最核心、最基础的对象单元。现在就让我们从这里起步吧。 1. 创建表&#xff1a; CREATE…

linux文本文件和win文本文件的格式互换

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 有时在WIN下编辑好的脚本文件上传到LINUX服务器中不能正常执行&#xff0c;开始误认为是LINUX配置问题&#xff0c;后来才发现是WIN与LINUX存储文件时的换行符标志不同造成的。在DOS使用的换行符为 ^M$&…

抽取网络信息进行数据挖掘 建立语料库

最近的实习项目需要做一个大数据库&#xff08;语料库&#xff09;&#xff0c;采集博客、微博、问答库的信息。将数据库的内容进行训练&#xff0c;最后应该是做成一个类似中文siri的模型吧。 第一步新闻抓取器已经稳定运行了&#xff0c;基本原理用的是爬虫去爬新闻门户网站的…

Hive hang without response

前些天Hive查询的接口一直超时报警&#xff0c;登录上去查看发现这个超时报警的曲线很有规律&#xff0c;每个小时开始就出现&#xff0c;过了大约3分钟左右就好了.在这个期间里&#xff0c;也发现hive根本就执行不了&#xff0c;完全hang住了&#xff0c;机器负载&#xff0c;…