快速排序
快速排序演算法是對冒泡演算法的乙個優化。他的思想是先對陣列進行分割,把大的元素數值放到乙個臨時陣列裡,把小的元素數值放到另乙個臨時陣列裡(這個分割的點可以是陣列中的任意乙個元素值,一般用第乙個元素,即$array[0]),然後繼續把這兩個臨時陣列重複上面拆分,最後把小的陣列元素和大的陣列元素合併起來。這裡用到了遞迴的思想
function kuaisu($arr)
$key = $arr[0];
$left_arr = array();
$right_arr = array();
for($i=1;$i<$len;$i++)else
}$left_arr =kuaisu($left_arr);
$right_arr =kuaisu($right_arr);
returnarray_merge($left_arr, array($key), $right_arr);
}$array1=array(5,3,8,2,5,9,7,2,1,4,0);
$array1=kuaisu($array1);
print_r($array1);
其實快速排序之所以稱之快速,就是因為,氣泡排序是每次對比只交換相鄰的兩個值的位置,這樣每個值要移動到它最終的排序結果中所對應的位置,可能需要很多次位置的變化。但是快速排序可在一次劃分中,就確定你選定的那個對比值在最終排序好的佇列中的位置。
該演算法是通過分治遞迴來實現的,其效率很大程度上取決於參考元素的選擇,可以選擇陣列的中間元素,也可以隨機得到三個元素,然後選擇中間的那個元素(三數中值法)。
另外還有一點,就是當我們在分割時,如果分割出來的子串行的長度很小的話(小於5到20),通常遞迴的排序的效率就沒有諸如插入排序或希爾排序那麼快了。因此可以會去判斷陣列的長度,如果小於10的話,直接用插入排序,而不再遞迴呼叫這個快速排序
一群猴子排成一圈,按1,2,...,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去...,如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m、n,輸出最後那個大王的編號。
這是著名的約瑟夫環問題,除了下邊兩種方法解決,還可以使用優先佇列來解決問題. 猴子選大王和擊鼓傳花本質是一樣的
<?php
// 方案一,使用php來模擬這個過程
function king($n,$m)
}// 剩下的最後乙個就是大王了
return $mokey[0];
}// 測試
echo king(10,7);
// 方案二,使用數學方法解決
function josephus($n,$m)
return $r+1;
}// 測試
print_r(josephus(10,7));
?>
順序查詢與二分查詢
<?php
/*** 順序查詢
* @param array $arr 陣列
* @param $k 要查詢的元素
* @return mixed 成功返回陣列下標,失敗返回-1
*/function seq_sch($arr,$k)
}if($i < $n)else
}/**
* 二分查詢,要求陣列已經排好順序
* @param array $array 陣列
* @param int $low 陣列起始元素下標
* @param int $high 陣列末尾元素下標
* @param $k 要查詢的元素
* @return mixed 成功時返回陣列下標,失敗返回-1
*/functionbin_sch($array,$low,$high,$k) elseif ($k <$array[$mid]) else
}return -1;
}// 測試:順序查詢
$arr1 =array(9,15,34,76,25,5,47,55);
echo seq_sch($arr1,47);//結果為6
echo "";
// 測試:二分查詢
$arr2 =array(5,9,15,25,34,47,55,76);
echobin_sch($arr2,0,7,47);//結果為5
?>
快速排序 二分查詢
1.舉例說明一下吧,這個可能不是太好理解。假設要排序的序列為 2 4 9 3 6 7 1 5 首先用2當作基準,使用i j兩個指標分別從兩邊進行掃瞄,把比2小的元素和比2大的元素分開。首先比較2和5,5比2大,j左移 2 4 9 3 6 7 1 5 比較2和1,1小於2,所以把1放在2的位置 1 4...
快速排序 二分查詢
基準數後面的數需要大於基準數,從後向前尋找a j tmp,尋找到a 8 的3 5,將a 8 放入空位a 0 中,a j a 8 此時空出位置 接著從前向後遍歷a i 5,找到a 1 符合條件,將a 1 放入空位a 8 a 1 空出 繼續從後向前尋找 繼續從後向前尋找 遍歷至i j 結束,此時i前邊元...
二分查詢,氣泡排序, 快速排序
class test if start 1 end else mid start intval end start 2 if arr mid x elseif arr mid x elseif arr mid x 氣泡排序 思路 如原始有x個值需要排序 控制最大的值一直往右移動,第一次迴圈必然造成最...