PHP四種排序歸納與實現
排序:對一組數據,依據指定的規則順序進行排列的過程!
- 1.冒泡排序
- 選定一個較大的元素爲基準與前一個元素進行比較,較大的值下沉較小的值上升
- 算法:對一個數組進行循環比較,第一層循環比較次數爲數組長度減一,其他內層循環爲外層循環的次數減一
- 2.優化
- 排序比較耗費資源,通過優化可以使一些有序數組不進行循環排序,從而節約資源,減少訪問時間
function maopao(&$arr)
{
//確定數組長度
$arr_size = count($arr);
//確定外層循環次數(數組長度減一)
//優化:定義一個標籤並且初始化
$flage = 0;
for($i = 0;$i < $arr_size - 1; $i++)
{
//確定內層循環(當前外層循次數減一)
for($j = 0 ;$j <$arr_size - 1 -$i;$j++)
{
//元素比較排序(從小到大排序),如果前面的數據比後面的大則交換數據
if($arr[$j] < $arr[$j+1])
{
//定義中間量
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
//進行過比較改變標籤狀態;
$flage = 1;
}
}
//對標籤狀態進行判斷
if($flage == 0)
{
//如果標籤$flage==0標籤狀態沒有改變,說明沒有進行過比較,則該數據已經處於有序狀態不需要進行排序則退出;
break;
}
elseif($flage == 1)
{
//如果標籤$flage==1 說明數據最少進行過一次比較,則初始化標籤繼續進行比較
$falge = 0;
}
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
maopao($arr);
echo '<pre>';
print_r($arr);
echo "<hr>";
2.選擇排序
- 算法:第一次在R[0]R[n-1]中選出最小值,把結果交給R[0];第二次在R[0+1]R[n-1]中選出最小值並把結果交給R[0+1];以此類推直到整個數組排序完畢!
function xuanzhe(&$arr)
{
//取得數組元素個數
$arr_size = count($arr);
//進行第一重循環
for($i = 0; $i < $arr_size-1 ;$i++)
{
// 假設$arr[$i]爲最小值
$min_val = $arr[$i];
//$min_val_index爲最小值的下標
$min_val_index = $i;
//第二層循環,求出最小值
for($j = $i+1;$j < $arr_size ;$j++ )
{
//判斷,進行值交換
if($min_val > $arr[$j])
{
//重置最小值和下標
$min_val = $arr[$j];
$min_val_index = $j;
}
}
//進行值跟下標的交換並優化
//判斷下標
if($min_val_index != $i)
{
$arr[$min_val_index] = $arr[$i];
$arr[$i] = $min_val;
}
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
xuanzhe($arr);
echo '<pre>';
print_r($arr);
echo "<hr>";
- 插入排序:
- 將一個數組拆分爲一個有序數組和一個無序數組,將無序數組中的元素與有序數組中的元素進行比較並且插入
function insertsort(&$arr)
{
//計算數組長度
$arr_size = count($arr);
//第一次循環取數組第一個元素爲有序數組,所以無序數組第一位下標爲1
for($i = 1 ; $i < $arr_size ;$i++)
{
//先把$arr[$i]保存到$insterVal中防止被覆蓋掉
$insertVal = $arr[$i];
//確定有序列表的最後一個元素的下標
$index = $i - 1;
while ($index >= 0 && $arr[$index] > $insertVal) {
//將$index下標對應的元素後移
$arr[$index + 1] = $arr[$index];
$index--;
}
//將$insertVal的值讓到$index+1位
$arr[$index + 1] = $insertVal;
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
insertsort($arr);
echo '<pre>';
print_r($arr);
echo "<hr>";
4- 快速排序
- 快速排序算法是對冒泡算法的一個優化。他的思想是先對數組進行分割, 把大的元素數值放到一個臨時數組裏,把小的元素數值放到另一個臨時數組裏(這個分割的點可以是數組中的任意一個元素值,一般用第一個元素,即$array[0]),然後繼續把這兩個臨時數組重複上面拆分,最後把小的數組元素和大的數組元素合併起來。這裏用到了遞歸的思想。
function quicksort($arr){
$length = count($arr);
if($length<=1){
return $arr;
}else{
$left = array();
$right = array();
for($i=1;$i<$length;$i++){
if($arr[$i]<$arr[0]){
$left[]=$arr[$i];
}else{
$right[]=$arr[$i];
}
}
$left = quicksort($left);
$right = quicksort($right);
return array_merge($left,array($arr[0]),$right);
}
}
$arr = array(3,1,5,8,30,50,20,90,-100,0,-70,-90);
$result = quicksort($arr);
echo "<pre>";
print_r($result);
echo "</pre>";