<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    從制造到創造
    軟件工程師成長之路
    posts - 292,  comments - 96,  trackbacks - 0
    常用算法

    ??1?////////////////////////////////////////////////////////////////////////////////
    ??2?//
    ??3?//????????????????????????????常用算法
    ??4?//
    ??5?////////////////////////////////////////////////////////////////////////////////
    ??6?
    ??7?#include?<stdio.h>
    ??8?#include?<string.h>
    ??9?
    ?10?void?BubbleSort(?int?nArr[],?int?nLength?);
    ?11?void?SelectSort(?int?nArr[],?int?nLength?);
    ?12?void?InsertSort(?int?nArr[],?int?nLength?);
    ?13?void?QuickSort(?int?nArr[],?int?nLength?);
    ?14?int?Search(?int?nArr[],?int?nLength,?const?int?nFindVal?);
    ?15?int?HalfSearch(?int?nArr[],?int?nLength,?const?int?nFindVal?);
    ?16?
    ?17?
    ?18?////////////////////////////////////////////////////////////////////////////////
    ?19?//
    ?20?//????1、排序
    ?21?//
    ?22?////////////////////////////////////////////////////////////////////////////////
    ?23?
    ?24?////////////////////////////////////////////////////////////////////////////////
    ?25?//
    ?26?//????1.1、冒泡排序
    ?27?//
    ?28?//????????冒泡排序的基本思想:
    ?29?//????????從R[0]開始,逐個比較R[i]和R[i+1](i=0,1,,n-1)的大小,若R[i]?>?R[i+1]
    ?30?//????則交換R[i]和R[i+1]的位置。第一趟全部比較完畢后R[n-1]是序列中最大的元素。再從
    ?31?//????R[1]開始逐個比較R[i]和R[i+1](i=0,1,,n-2)的大小若R[i]?>?R[i+1]則交換R[i]
    ?32?//????和R[i+1]的位置。等第二趟全部比較完畢后R[n-2]是序列中最大的元素。如此反復進行
    ?33?//????n-1趟冒泡排序后,序列中的元素便排好序了。
    ?34?//
    ?35?////////////////////////////////////////////////////////////////////////////////
    ?36?
    ?37?void?BubbleSort(?int?nArr[],?int?nLength?)
    ?38?{
    ?39?????int?i,?j,?iTemp;
    ?40?????bool?bIsChange?=?true;
    ?41?
    ?42?????for?(?i?=?0;?i?<?nLength?-?1;?i++?)
    ?43?????{
    ?44?????????if?(?!bIsChange?)
    ?45?????????{
    ?46?????????????break;
    ?47?????????}
    ?48?
    ?49?????????bIsChange?=?false;
    ?50?????????for?(?j?=?0;?j?<?nLength?-?1?-?i;?j++?)
    ?51?????????{
    ?52?????????????if?(?nArr[j]?>?nArr[j?+?1]?)
    ?53?????????????{
    ?54?????????????????iTemp?=?nArr[j];
    ?55?????????????????nArr[j]?=?nArr[j?+?1];
    ?56?????????????????nArr[j?+?1]?=?iTemp;
    ?57?
    ?58?????????????????bIsChange?=?true;
    ?59?????????????}
    ?60?????????}
    ?61?????}
    ?62?}
    ?63?
    ?64?////////////////////////////////////////////////////////////////////////////////
    ?65?//
    ?66?//????1.2、選擇排序
    ?67?//
    ?68?//????????選擇排序的基本思想:
    ?69?//????????設所排列序列的元素個數為n,對i值取0,1,2,,n-2,從R[i],,R[n-1]這些
    ?70?//????元素中找出最小的元素,與R[i]進行交換,執行n-1趟后完成了元素排序。
    ?71?//
    ?72?////////////////////////////////////////////////////////////////////////////////
    ?73?
    ?74?void?SelectSort(?int?nArr[],?int?nLength?)
    ?75?{
    ?76?????int?i,?j,?nMinIndex,?nTemp;
    ?77?
    ?78?????for?(?i?=?0;?i?<?nLength;?i++?)
    ?79?????{
    ?80?????????nMinIndex?=?i;
    ?81?????????for?(?j?=?i?+?1;?j?<?nLength;?j++?)
    ?82?????????{
    ?83?????????????if?(?nArr[j]?<?nArr[nMinIndex]?)
    ?84?????????????{
    ?85?????????????????nMinIndex?=?j;
    ?86?????????????}
    ?87?????????}
    ?88?
    ?89?????????if?(?i?!=?nMinIndex?)
    ?90?????????{
    ?91?????????????nTemp?=?nArr[nMinIndex];
    ?92?????????????nArr[nMinIndex]?=?nArr[i];
    ?93?????????????nArr[i]?=?nTemp;
    ?94?????????}
    ?95?????}
    ?96?}
    ?97?
    ?98?////////////////////////////////////////////////////////////////////////////////
    ?99?//
    100?//????1.3、插入排序
    101?//
    102?//????????插入排序的基本思想:
    103?//????????把n個元素的序列劃分為己排序部分和未排序部分,即在處理第i個元素R[i-1]時,
    104?//????R[0],R[1],,R[i-2]是已排好的有序部分,R[i-1],R[i],,R[n-1]屬于未排序的
    105?//????部分。這時,用R[i-1]依次與R[0],R[1],,R[i-2]進行比較,找出在該有序序列中
    106?//????應插入的位置,將R[i-1]插入,原位置上的元素R[i-1]均順序后移一位。將上述過程
    107?//????從i=1到i=n-1執行n-1趟,就完成了這個序列的所有元素的排序。
    108?//
    109?////////////////////////////////////////////////////////////////////////////////
    110?
    111?void?InsertSort(?int?nArr[],?int?nLength?)
    112?{
    113?????int?i,?j,?nCurVal;
    114?
    115?????for?(?i?=?1;?i?<?nLength;?i++?)
    116?????{
    117?????????nCurVal?=?nArr[i];
    118?????????j?=?i?-?1;????????????????//?j指向有序序列的最后一個元素
    119?
    120?????????while?(?(?j?>=?0?)?&&?(?nCurVal?<?nArr[j]?)?)
    121?????????{
    122?????????????nArr[j?+?1]?=?nArr[j];????????//?后移一位
    123?????????????j--;
    124?????????}
    125?
    126?????????nArr[j?+?1]?=?nCurVal;????????????//?插入當前元素
    127?????}
    128?}
    129?
    130?////////////////////////////////////////////////////////////////////////////////
    131?//
    132?//????1.4、快速排序
    133?//
    134?//????????快速排序的基本思想:
    135?//????????在要排序的n個元素中任取一個元素R(這里取中間元素),以該元素為基準,將所有
    136?//????剩下的n-1元素分為兩個子序列,第一個子序列中每個元素均小于或等于R,第二個子序
    137?//????列中每個元素均大于R;然后將R放在第一個序列之后及第二個序列之前,使得待排序
    138?//????序列成為<子序列1>?R?<子序列2>的形式,這完成了快速排序的第一趟排序;分別對子
    139?//????序列1和子序列2重復上述劃分,直到每個子序列中只有一個元素時為止。
    140?//
    141?////////////////////////////////////////////////////////////////////////////////
    142?
    143?void?Sort(?int?nArr[],?int?nLeft,?int?nRight?)
    144?{
    145?????int?i?=?nLeft,?j?=?nRight,?x,?y;
    146?
    147?????x?=?nArr[(?nLeft?+?nRight?)?/?2];
    148?
    149?????do
    150?????{
    151?????????while?(?(?nArr[i]?<?x?)?&&?(?i?<?nRight?)?)
    152?????????{
    153?????????????i++;
    154?????????}
    155?????????while?(?(?nArr[j]?>?x?)?&&?(?j?>?nLeft?)?)
    156?????????{
    157?????????????j--;
    158?????????}
    159?
    160?????????if?(?i?<=?j?)
    161?????????{
    162?????????????y?=?nArr[i];
    163?????????????nArr[i]?=?nArr[j];
    164?????????????nArr[j]?=?y;
    165?
    166?????????????i++;
    167?????????????j--;
    168?????????}
    169?????}
    170?????while?(?i?<=?j?);
    171?
    172?????if?(?nLeft?<?j?)
    173?????{
    174?????????Sort(?nArr,?nLeft,?j?);
    175?????}
    176?????if?(?nRight?>?i?)
    177?????{
    178?????????Sort(?nArr,?i,?nRight?);
    179?????}
    180?}
    181?
    182?void?QuickSort(?int?nArr[],?int?nLength?)
    183?{
    184?????Sort(?nArr,?0,?nLength?-?1?);
    185?}
    186?
    187?////////////////////////////////////////////////////////////////////////////////
    188?//
    189?//????2、查找
    190?//
    191?////////////////////////////////////////////////////////////////////////////////
    192?
    193?////////////////////////////////////////////////////////////////////////////////
    194?//
    195?//????2.1、順序查找
    196?//
    197?//????????順序查找的基本思想:
    198?//????????從第一個元素開始,逐個地將元素與給定值X進行比較,若相等,則查找成功;
    199?//????若直至最后一個元素都不相等,則查找失敗。
    200?//
    201?////////////////////////////////////////////////////////////////////////////////
    202?
    203?int?Search(?int?nArr[],?int?nLength,?const?int?nFindVal?)
    204?{
    205?????int?nIndex?=?-1;
    206?????int?i?=?0;
    207?
    208?????while?(?(?i?<?nLength?)?&&?(?nArr[i]?!=?nFindVal?)?)
    209?????{
    210?????????i++;
    211?????}
    212?
    213?????if?(?i?!=?nLength?)
    214?????{
    215?????????nIndex?=?i;
    216?????}
    217?
    218?????return?nIndex;
    219?}
    220?
    221?////////////////////////////////////////////////////////////////////////////////
    222?//
    223?//????2.1、折半查找
    224?//
    225?//????????折半查找的前提是所有元素是有序的,其基本思想:
    226?//????????將要查找的x先與中間位置的元素比較,若相等,則查找成功;若x大于該中間位置
    227?//????的元素,則在后半部繼續進行折半查找,否則在前半部進行折半查找,直到查找到成功
    228?//????或失敗為止。
    229?//
    230?////////////////////////////////////////////////////////////////////////////////
    231?
    232?int?HalfSearch(?int?nArr[],?int?nLength,?const?int?nFindVal?)
    233?{
    234?????int?nIndex?=?-1;
    235?
    236?????int?nLeft?=?0,?nRight?=?nLength?-?1;
    237?????int?nMid;
    238?
    239?????bool?bIsFind?=?false;
    240?
    241?????while?(?(?nLeft?<=?nRight?)?&&?(?!bIsFind?)?)
    242?????{
    243?????????nMid?=?(?nLeft?+?nRight?)?/?2;
    244?
    245?????????if?(?nFindVal?==?nArr[nMid]?)
    246?????????{
    247?????????????bIsFind?=?true;
    248?????????}
    249?????????else?if?(?nFindVal?>?nArr[nMid]?)
    250?????????{
    251?????????????nLeft?=?nMid?+?1;
    252?????????}
    253?????????else
    254?????????{
    255?????????????nRight?=?nMid?-?1;
    256?????????}
    257?????}
    258?
    259?????if?(?nRight?)
    260?????{
    261?????????nIndex?=?nMid;
    262?????}
    263?
    264?????return?nIndex;
    265?}
    266?
    posted on 2006-09-08 19:28 CoderDream 閱讀(462) 評論(0)  編輯  收藏 所屬分類: 算法

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    <2006年9月>
    272829303112
    3456789
    10111213141516
    17181920212223
    24252627282930
    1234567

    常用鏈接

    留言簿(9)

    我參與的團隊

    隨筆分類(245)

    隨筆檔案(239)

    文章分類(3)

    文章檔案(3)

    收藏夾(576)

    友情鏈接

    搜索

    •  

    積分與排名

    • 積分 - 459733
    • 排名 - 114

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲V无码一区二区三区四区观看| 99精品全国免费观看视频| 免费一看一级毛片全播放| 中文字幕无码亚洲欧洲日韩| 最近免费中文字幕大全免费 | 美女内射毛片在线看免费人动物| 亚洲精品高清无码视频| 最新国产乱人伦偷精品免费网站| 亚洲人成影院在线无码按摩店| 美女被免费网站91色| 亚洲综合区小说区激情区| 国产免费久久精品丫丫| 亚洲美女又黄又爽在线观看| 免费av一区二区三区| 亚洲男人的天堂在线播放| 色欲A∨无码蜜臀AV免费播| 中文字幕亚洲免费无线观看日本| 永久在线免费观看| xxx毛茸茸的亚洲| 午夜寂寞在线一级观看免费| 国产偷国产偷亚洲清高APP| 国产成人免费一区二区三区| 美女被免费视频网站| 亚洲人成人一区二区三区| 日本在线看片免费人成视频1000| 亚洲福利视频一区二区三区| 啦啦啦中文在线观看电视剧免费版| 国产AV无码专区亚洲AV麻豆丫| 亚洲日韩国产一区二区三区| 嫩草成人永久免费观看| 性xxxx黑人与亚洲| 亚洲日本va午夜中文字幕久久| 久久青草免费91观看| 一本色道久久88—综合亚洲精品 | 成人毛片18女人毛片免费视频未| 亚洲AV无码一区二区三区久久精品 | 污污视频免费观看网站| 亚洲免费观看视频| 免费做爰猛烈吃奶摸视频在线观看 | 免费成人av电影| 久久免费观看国产精品|