日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/20 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MTK优美代码赏析6:电话本里的快速排序和插入排序算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
MTK優(yōu)美代碼賞析6:電話本里的快速排序和插入排序算法 記得讀書的時候?qū)W數(shù)據(jù)結(jié)構(gòu)和一些程序基礎(chǔ)的課程,學(xué)了很多的排序算法,當(dāng)時感覺蠻有趣,也很簡單,當(dāng)大學(xué)的教育是以理論為主的,哪些教授們又沒給咱舉個實(shí)用的例子說明為什么要教我們這個,所以考完試就把這些沒用的東東給忘了... 最近為了實(shí)現(xiàn)自己的一個應(yīng)用不得已去啃電話本,竟然發(fā)現(xiàn)里面有一個簡單的不錯的排序算法,只所以不錯,是因?yàn)樗幖軜?gòu)的位置和作用我很清楚,但其內(nèi)部的代碼邏輯竟然一時沒有看懂,汗! 當(dāng)然電話本里排序的算法很多。這只是其中一個例子... 1.首先補(bǔ)習(xí)一下排序算法的基礎(chǔ),下班回家我在網(wǎng)上找了關(guān)于排序的資料,算法描述的很簡單,但可能因?yàn)樽约杭磳⑹I(yè)的緣故吧,有個別例子自己竟一時也沒看懂,頭大...希望各位看客不要象我一樣荒廢了大學(xué)交的學(xué)費(fèi)啊! 冒泡排序
http:
//baike.baidu.com/view/254413.htm
快速排序算法
http:
//baike.baidu.com/view/19016.htm
插入排序
http:
//baike.baidu.com/view/396887.htm

?

???2.然后看一看這個電話本排序算法的背景.電話本是任何的手機(jī)都應(yīng)該具備的最基本的功能,他本身的存儲和管理就已經(jīng)比較復(fù)雜,還需要和通話,短信等聯(lián)系在一起構(gòu)成完整的系統(tǒng),這里講的就是里面最簡單的需求:來電或來短信使要顯示電話本里對應(yīng)的姓名.

我們用的MTK平臺又是如何實(shí)現(xiàn)這一需求的呢?寫到這里就要從MTK電話本開機(jī)初始化寫起,見網(wǎng)址http://blog.sina.com.cn/s/blog_64a85b990100hbiy.html. mmi_phb_ind_startup_read時系統(tǒng)逐一獲得l4層給的電話本數(shù)據(jù)(SIM卡和手機(jī)里存的數(shù)據(jù)格式是一致的,都只存姓名和號碼),通過mmi_phb_startup_read_entry寫入PhoneBook[MAX_PB_ENTRIES]中,并用g_phb_name_index[MAX_PB_ENTRIES]來存儲L4里對應(yīng)號碼索引store_index,用PhoneBookEntryCount來存儲讀出來的總數(shù) 讀取完成后,mmi_phb_init_build_lookup_table里的mmi_phb_op_increase_lookup_table函數(shù)將從手機(jī)和sim卡中讀取出來得姓名和號碼插入將號碼轉(zhuǎn)化為數(shù)字的LookUpTable[MAX_LOOKUP_TABLE_COUNT]中 mmi_phb_init_populate_lookup_table,每隔500毫秒讀取一次手機(jī)電話本內(nèi)存儲的號碼拓展信息(公司號碼,家庭號碼等),并將有效的號碼也轉(zhuǎn)化為數(shù)字存入LookUpTable[MAX_LOOKUP_TABLE_COUNT]中. LookUpTable的出現(xiàn)很好的解決了來信息來電話顯示號碼對應(yīng)姓名的問題,系統(tǒng)將這個結(jié)構(gòu)數(shù)組以號碼轉(zhuǎn)化的數(shù)字(截取后幾位,程序里可以指定這個位數(shù))進(jìn)行排序(今天講的排序就是這個排序)
typedef?
struct
{
????U16?store_index;????
/*?Store?Index?of?Phonebook,?Begin?from?0?*/
????U32?number;
}?MMI_PHB_LOOKUP_NODE_STRUCT;

?? 3.?? 通過獲取來電號碼,將來點(diǎn)號碼轉(zhuǎn)化為數(shù)字,然后在 LookUpTable中進(jìn)行比對獲取對應(yīng)store_index,通過找到store_index在g_phb_name_index中的位置找到PhoneBook[MAX_PB_ENTRIES]中對應(yīng)的姓名

?? LookUpTable加速了系統(tǒng)號碼的匹配,MTK系統(tǒng)必須保持這個數(shù)組的排序性.系統(tǒng)在完成拓展號碼讀取后即用mmi_phb_lookup_table_sort進(jìn)行對LookUpTable的排序.實(shí)際上對電話本的每一次增刪改操作系統(tǒng)都會調(diào)用mmi_phb_lookup_table_sort對LookUpTable進(jìn)行排序.

??作者:張素豐,轉(zhuǎn)載請注明出處:http://www.cnblogs.com/zhangsufeng/archive/2010/09/26/1836353.html?

?? 4.下面看排序代碼

??
//先看其切換節(jié)點(diǎn)的函數(shù)
/*
****************************************************************************
?*?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函數(shù)
/*
****************************************************************************
?*?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)//該標(biāo)記紀(jì)錄LookUpTable使用的實(shí)際長度
????{
????????
/*?Set?to?zero?beore?sorting,?check?if?this?flag?larger?than?phonebook?entries?to?see?if?finish?sorting.?*/
????????g_phb_cntx.populate_count?
=?0;//該標(biāo)記紀(jì)錄是否完成排序,為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 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/zhangsufeng/archive/2010/09/26/1836353.html

總結(jié)

以上是生活随笔為你收集整理的MTK优美代码赏析6:电话本里的快速排序和插入排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。