快速排序 約瑟夫問題 順序查詢 二分查詢

2021-07-10 12:32:41 字數 2235 閱讀 3992

快速排序

快速排序演算法是對冒泡演算法的乙個優化。他的思想是先對陣列進行分割,把大的元素數值放到乙個臨時陣列裡,把小的元素數值放到另乙個臨時陣列裡(這個分割的點可以是陣列中的任意乙個元素值,一般用第乙個元素,即$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個值需要排序 控制最大的值一直往右移動,第一次迴圈必然造成最...