最近準備面試的資料,順便整理一下以前的基本演算法,寫個demo記錄一下
冒泡
//冒泡
//逐行對比,滿足條件則交換
function
bubblesort
($arrdata,$sort = 'desc')
}if($issorted) break;
}return
$arrdata;
}
快速排序//快速排序
//選取乙個標準,和其他資料對比後將資料分為兩批,遞迴執行後合併
function
quicksort
(&$arr, $sort = 'asc') else
}$arr = array_merge($this->quicksort($arrleftdata, $sort), array($nstandard), $this->quicksort($arrrightdata, $sort));
}return
$arr;
}
歸併排序//利用歸併(合併)的思想實現的排序方法。
//它的原理是假設初始序列含有 n 個元素,則可以看成是 n 個有序的子串行,每個子串行的長度為 1,然後兩兩歸併
//得到n/2個長度為2或1 的有序序列;再兩兩歸併,······,如此重複
//直至得到乙個長度為 n 的有序序列為止,這種排序方法就成為 2 路歸併排序
//merge函式將指定的兩個有序陣列(arr1,arr2)合併並且排序
//我們可以找到第三個陣列,然後依次從兩個陣列的開始取資料哪個資料小就先取哪個的,然後刪除掉剛剛取過的資料
function
al_merge
($arra,$arrb)
return array_merge($arrc, $arra, $arrb);
}//歸併排序函式
function
al_merge_sort
($arr)
二分查詢//二分查詢
//假設資料是按公升序排序的,對於給定值x,從序列的中間位置開始比較,如果當前位置值等於x,則查詢成功;
//若x小於當前位置值,則在數列的前半段中查詢;若x大於當前位置值則在數列的後半段中繼續查詢,直到找到為止
function
binsearch
($tosearch,$arr)
elseif ($arr[$nmiddlenum] < $tosearch) else
}return
false;
}
順序查詢//順序查詢
function
seqsearch
($arr,$tosearch)
}return -1;
}
選擇排序//在第一次迴圈中,假設第乙個數是最小的;然後跟第二個數比較,一直比到最後,找出最小值,然後把最小值跟第乙個數的位置互換;
//再進行下一次迴圈,找出最小值跟第二個位置的數互換;一直迴圈陣列的個數減去1次;陣列就成了有序的了
function
selectsort
($arr)}}
return
$arr;
}
外部排序+多路歸併
思路參考:
面試中經常問到一些關於 平行計算 或者 在一台記憶體不多的機器上進行大檔案排序 的問題,這些其實思路都可以借助外部排序+多路歸併去解決:
只能一部分放在放在記憶體陣列中,另一部分放在記憶體之外(硬碟或網路其它節點),這就是所謂的外部排序;
歸併排序:將資料分為左右兩部分,分別排序,再把兩個有序子陣列進行歸併;
重點就是歸併過程,就是兩個已排序好的陣列來比較頭部的元素,取最小值放入最終陣列中;
思路:
第一步:將資料進行切分,例如以100m將1g的檔案分為10組,將每一段資料分配到外部,切分的大小符合節點記憶體大小限制;
第二步:這樣每個節點各自對分配資料進行排序,採用歸併排序或快速排序皆可(多節點則節點處理,單機則逐個處理);
第三步:將每個排序好的節點按照歸併演算法整合到乙個節點(多路歸併);
演算法之php版
列出可能會用到的幾個演算法 desc 列印出乙個菱形 function diamond n for k 0 k 2 i k echo for i n i 0 i for j 0 j n i j for k 0 k 2 i k echo diamond 3 desc 氣泡排序 function bub...
常用演算法(C版)
演算法 algorithm 計算機解題的基本思想方法和步驟。演算法的描述 是對要解決乙個問題或要完成一項任務所採取的方法和步驟的描述,包括需要什麼資料 輸入什麼資料 輸出什麼結果 採用什麼結構 使用什麼語句以及如何安排這些語句等。通常使用自然語言 結構化流程圖 偽 等來描述演算法。一 計數 求和 求...
php常用演算法
二分查詢 陣列裡查詢某個元素 function bin sch array,low,high,k elseif k array mid else return 1 順序查詢 陣列裡查詢某個元素 function seq sch array,n,k if i n else 線性表的刪除 陣列中實現 f...