PHP四種排序歸納與實現

PHP四種排序歸納與實現

排序:對一組數據,依據指定的規則順序進行排列的過程!

  1. 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>";
  1. 插入排序:
  • 將一個數組拆分爲一個有序數組和一個無序數組,將無序數組中的元素與有序數組中的元素進行比較並且插入
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>"; 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章