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

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

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

    從制造到創(chuàng)造
    軟件工程師成長之路
    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]是序列中最大的元素。如此反復(fù)進(jìn)行
    ?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?//????????設(shè)所排列序列的元素個數(shù)為n,對i值取0,1,2,,n-2,從R[i],,R[n-1]這些
    ?70?//????元素中找出最小的元素,與R[i]進(jìn)行交換,執(zhí)行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]進(jìn)行比較,找出在該有序序列中
    106?//????應(yīng)插入的位置,將R[i-1]插入,原位置上的元素R[i-1]均順序后移一位。將上述過程
    107?//????從i=1到i=n-1執(zhí)行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;????????????//?插入當(dāng)前元素
    127?????}
    128?}
    129?
    130?////////////////////////////////////////////////////////////////////////////////
    131?//
    132?//????1.4、快速排序
    133?//
    134?//????????快速排序的基本思想:
    135?//????????在要排序的n個元素中任取一個元素R(這里取中間元素),以該元素為基準(zhǔn),將所有
    136?//????剩下的n-1元素分為兩個子序列,第一個子序列中每個元素均小于或等于R,第二個子序
    137?//????列中每個元素均大于R;然后將R放在第一個序列之后及第二個序列之前,使得待排序
    138?//????序列成為<子序列1>?R?<子序列2>的形式,這完成了快速排序的第一趟排序;分別對子
    139?//????序列1和子序列2重復(fù)上述劃分,直到每個子序列中只有一個元素時為止。
    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進(jìn)行比較,若相等,則查找成功;
    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?//????的元素,則在后半部繼續(xù)進(jìn)行折半查找,否則在前半部進(jìn)行折半查找,直到查找到成功
    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 閱讀(456) 評論(0)  編輯  收藏 所屬分類: 算法

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


    網(wǎng)站導(dǎo)航:
    相關(guān)文章:
     

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

    常用鏈接

    留言簿(9)

    我參與的團(tuán)隊

    隨筆分類(245)

    隨筆檔案(239)

    文章分類(3)

    文章檔案(3)

    收藏夾(576)

    友情鏈接

    搜索

    •  

    積分與排名

    • 積分 - 458130
    • 排名 - 114

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 中文字幕无线码中文字幕免费| 亚洲免费在线视频| 国产在线不卡免费播放| 女人18毛片水最多免费观看| 99热在线精品免费全部my| 国国内清清草原免费视频99| 久草视频免费在线| 成人福利免费视频| 欧亚精品一区三区免费| 成年女人男人免费视频播放| 毛片基地免费观看| 毛片免费观看的视频在线| 天天摸天天操免费播放小视频| 麻豆成人精品国产免费| 国产极品美女高潮抽搐免费网站| 国产高清视频在线免费观看| 四虎永久免费影院在线| 亚洲中文字幕无码专区| 国产精品亚洲精品日韩已满| 亚洲三级电影网址| 亚洲va精品中文字幕| 亚洲av乱码中文一区二区三区| 极品美女一级毛片免费| 日韩精品无码免费专区午夜不卡| 精品国产免费一区二区三区香蕉 | 亚洲精品少妇30p| 亚洲综合精品一二三区在线| 亚洲国产午夜精品理论片| 亚洲一区二区三区高清在线观看| 国产成人亚洲综合a∨| a级午夜毛片免费一区二区| 99re这里有免费视频精品 | 一本一道dvd在线观看免费视频 | 亚洲www在线观看| 国产亚洲欧美在线观看| eeuss影院免费直达入口| 3344永久在线观看视频免费首页| 99视频在线精品免费观看6| 亚洲Av无码国产情品久久| 亚洲AV无码国产在丝袜线观看| 亚洲人成电影院在线观看|