從制造到創造
          軟件工程師成長之路
          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 閱讀(458) 評論(0)  編輯  收藏 所屬分類: 算法

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


          網站導航:
           

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

          常用鏈接

          留言簿(9)

          我參與的團隊

          隨筆分類(245)

          隨筆檔案(239)

          文章分類(3)

          文章檔案(3)

          收藏夾(576)

          友情鏈接

          搜索

          •  

          積分與排名

          • 積分 - 458389
          • 排名 - 114

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南昌市| 天水市| 驻马店市| 河间市| 西华县| 民丰县| 万荣县| 玛多县| 乃东县| 高邮市| 东丰县| 佛学| 新宁县| 同江市| 本溪市| 布拖县| 涟水县| 社会| 亳州市| 甘孜| 法库县| 桂林市| 特克斯县| 寻乌县| 广水市| 澄江县| 内丘县| 阜新市| 章丘市| 武夷山市| 平原县| 潍坊市| 东阿县| 临安市| 新化县| 丰城市| 濮阳市| 阿尔山市| 沙雅县| 焦作市| 辽宁省|