php陣列四種排序演算法
氣泡排序
/* 冒泡演算法:結果從小到大
* @para $arr 傳人進去排序的陣列
* @return $newArr 排序之後的陣列
*/
function maopao($arr){
//一共是多少趟
for($i = count($arr)-1; $i>0; $i--){
$flag = 0;
//每一趟進行相鄰兩個數進行比較
for($j = 0; $j < $i; $j++){
if($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] =$temp;
$flag = 1;
}
}
if($flag == 0){
break;
}
}
return $arr;
}
$arr=array(30,40,10,50,20,60);
print_r(maopao($arr));
?>
/**
* [bubbleSort 氣泡排序]
* @param [array] $arr [待排序陣列]
* @return [array] [排序後陣列]
*/
function bubbleSort($arr)
{
//計算陣列長度
$length = count($arr);
//迴圈次數為陣列長度
for ($m=1; $m < $length; $m++)
{
//迴圈與該位置之後的數字比較
for ($n=0; $n < $length-$m; $n++)
{
//如果當前數字比後一個數字大
if($arr[$n] > $arr[$n+1])
{
//將下一個數字寫入快取變數中
$tmp = $arr[$n+1];
//將當前數字(也就是較大的數字)後移一位
$arr[$n+1] = $arr[$n];
//將快取的數字(也就是較小的數字)前移一位
$arr[$n] = $tmp;
}
}
}
return $arr;
}
$arr = array(45,12,48,14,99,22,75,36);
print_r(bubbleSort($arr));
選擇排序
/**
* [selectSort 選擇排序]
* @param [array] $arr [待排序陣列]
* @return [array] [排序後陣列]
*/
function selectSort($arr) {
//實現思路 雙重迴圈完成,外層控制輪數,當前的最小值。內層 控制的比較次數
//$i 當前最小值的位置, 需要參與比較的元素
for($i=0, $len=count($arr); $i<$len-1; $i++) {
//先假設最小的值的位置
$p = $i;
//$j 當前都需要和哪些元素比較,$i 後邊的。
for($j=$i+1; $j<$len; $j++) {
//$arr[$p] 是 當前已知的最小值
if($arr[$p] > $arr[$j]) {
//比較,發現更小的,記錄下最小值的位置;並且在下次比較時,
// 應該採用已知的最小值進行比較。
$p = $j;
}
}
//已經確定了當前的最小值的位置,儲存到$p中。
//如果發現 最小值的位置與當前假設的位置$i不同,則位置互換即可
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最終結果
return $arr;
}
$arr = array(45,12,48,14,99,22,75,36);
print_r(selectSort($arr));
插入排序
/**
* [insertSort 插入排序]
* @param [array] $arr [待排序陣列]
* @return [array] [排序後陣列]
*/
function insertSort($arr) {
//區分 哪部分是已經排序好的
//哪部分是沒有排序的
//找到其中一個需要排序的元素
//這個元素 就是從第二個元素開始,到最後一個元素都是這個需要排序的元素
//利用迴圈就可以標誌出來
//i迴圈控制 每次需要插入的元素,一旦需要插入的元素控制好了,
//間接已經將陣列分成了2部分,下標小於當前的(左邊的),是排序好的序列
for($i=1, $len=count($arr); $i<$len; $i++) {
//獲得當前需要比較的元素值。
$tmp = $arr[$i];
//內層迴圈控制 比較 並 插入
for($j=$i-1;$j>=0;$j--) {
//$arr[$i];//需要插入的元素; $arr[$j];//需要比較的元素
if($tmp < $arr[$j]) {
//發現插入的元素要小,交換位置
//將後邊的元素與前面的元素互換
$arr[$j+1] = $arr[$j];
//將前面的數設定為 當前需要交換的數
$arr[$j] = $tmp;
} else {
//如果碰到不需要移動的元素
//由於是已經排序好是陣列,則前面的就不需要再次比較了。
break;
}
}
}
//將這個元素 插入到已經排序好的序列內。
//返回
return $arr;
}
$arr = array(45,12,48,14,99,22,75,36);
print_r(insertSort($arr));
快速排序
思路分析:選擇一個基準元素,通常選擇第一個元素或者最後一個元素。通過一趟掃描,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素。此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。
程式碼實現:
function quickSort($arr) {
//先判斷是否需要繼續進行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//選擇第一個元素作為基準
$base_num = $arr[0];
//遍歷除了標尺外的所有元素,按照大小關係放入兩個陣列內
//初始化兩個陣列
$left_array = array(); //小於基準的
$right_array = array(); //大於基準的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左邊陣列
$left_array[] = $arr[$i];
} else {
//放入右邊
$right_array[] = $arr[$i];
}
}
//再分別對左邊和右邊的陣列進行相同的排序處理方式遞迴呼叫這個函式
$left_array = quick_sort($left_array);
$right_array = quick_sort($right_array);
//合併
return array_merge($left_array, array($base_num), $right_array);
}
/**
* [quickSort 快速排序]
* @param [type] $arr [待排序陣列]
* @return [type] [排序後陣列]
*/
function quickSort($arr) {
//先判斷是否需要繼續進行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//如果沒有返回,說明陣列內的元素個數 多餘1個,需要排序
//選擇一個標尺
//選擇第一個元素
$base_num = $arr[0];
//遍歷 除了標尺外的所有元素,按照大小關係放入兩個陣列內
//初始化兩個陣列
$left_array = array();//小於標尺的
$right_array = array();//大於標尺的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左邊陣列
$left_array[] = $arr[$i];
} else {
//放入右邊
$right_array[] = $arr[$i];
}
}
//再分別對 左邊 和 右邊的陣列進行相同的排序處理方式
//遞迴呼叫這個函式,並記錄結果
$left_array = quickSort($left_array);
$right_array = quickSort($right_array);
//合併左邊 標尺 右邊
return array_merge($left_array, array($base_num), $right_array);
}
$arr = array(45,12,48,14,99,22,75,36);
print_r(quickSort($arr));