PHP冒泡排序詳解

<?php

function BubbleSort($str)
//定義一個名爲BubbleSort的函數,它有一個參數叫$str,這個參數必須是一個數組,這個數組裏包含需要排序的一系列字符。
{
for ($i=0;$i<count($str)-1;$i++) //count($str)的功能爲統計數組中的元素數量,並返回這個數量值
//第一層循環,外層循環,由於冒泡排序的原理爲,每次都找最小(或每次都找最大,本例是演示每次都找最小的情況)的那個字符,找出一個最小(“大”)的字符算一次循環
{
for ($j=count($str)-2;$j>=$i;$j--)
//內層循環,本次循環控制找最小(“大”)數的操作,由於每次要找出最大的數,必須拿一個數和每一個數對比,所以也是一個內層的循環操作
{
if($str[$j+1]<$str[$j])
//比較,是$j+1位置的字符大,還是$j位置的字符比較大,如果$j位置的字符比較大,那麼交換$str[$j+1]和$str[$j]以保證排列在前面的字符更小
{
$tmp = $str[$j+1]; //交換兩個位置的東西,需要三個空位才能完成,就像交換一杯可樂和一杯牛奶需要另一個空杯子一樣,$tmp可以說就是空杯子
$str[$j+1]=$str[$j];//類似,有一杯牛奶,一杯可樂,我們想用牛奶杯裝可樂,可樂杯裝牛奶的話,就得進行這樣的操作……
$str[$j]=$tmp;//整個交換的過程可以描述爲:先將牛奶倒入空杯,再將可樂倒入牛奶杯,然後再將原來空杯裏的牛奶倒入可樂杯
}
}//內層循環每執行一次,就會多找出一個“最小”的字符(除了前面循環中已經找過了的)
}//數組裏有N個字符的話,循環就重複N-1次,這樣才能完成排序
return $str; //將排序後的結果返回,返回後跳出函數體,$str變量在內存中消失,而BubbleSort($str)的值就是$str所返回的值
}//函數體定義完成標誌我們稱之爲 end of function BubbleSort($str)
$str = array(3,6,1,5,9,0,4,6,11);//組出一個存放隨機序列的若干數字的數組
print_r(BubbleSort($str)); //調用函數體
?>
┃基本原理┃:兩兩比較待排序數據元素的大小,發現兩個數據元素的次序相反時即進行交換,直到沒有反序的數據元素爲止。
┃算法過程┃:設想被排序的數組$arr[0..N]垂直豎立,將每個數據元素看作有重量的氣泡,根據輕氣泡不能在重氣泡之下的原則,

從下往上掃描數組$arr時,凡掃描到違反本原則的輕氣泡,就使其向上"漂浮",如此反覆進行,直至最後任何兩個氣泡都是輕者在上,重者在下爲止。

<?php
//冒泡排序(一維數組)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count-1; $i++)
{
   for($j=$count-1; $j>$i; $j--)
   {
    //如果後一個元素小於前一個,則調換位置
    if ($array[$j] < $array[$j-1])
    {
     $tmp = $array[$j];
     $array[$j] = $array[$j-1];
     $array[$j-1] = $tmp;
    }
   }
}
return $array;
}
//使用實例
$arr = array(49, 38, 65, 97, 76, 13, 27);
$arr = bubble_sort($arr);
print_r($arr);
?>

排序實現過程如下:
49   38   65   97   76   13   27
38   49   65 97   76   13   27               比較第1個和第2個數,小的放前邊,大的放後邊
38   49   65   97   76   13   27               比較第2個和第3個數,小的放前邊,大的放後邊
38   49   65   97   76   13   27               比較第3個和第4個數,小的放前邊,大的放後邊
38   49   65   76   97   13   27               比較第4個和第5個數,小的放前邊,大的放後邊
38   49   65   76   13   97   27               比較第5個和第6個數,小的放前邊,大的放後邊
38   49   65   76   13   27   97               比較第6個和第7個數,小的放前邊,大的放後邊
至此,第一趟比較結束,得到以下排序:
38   49   65   76   13   27   97  
然後按照第一趟排序的方法繼續比較,直到完成排序。

<?php
//快速排序(數組排序)
function quick_sort($array)
{
if (count($array) <= 1) return $array;
$key = $array[0];   //把數組的第一個元素作爲關鍵數據
$left_arr = array();
$right_arr = array();
for ($i=1; $i<count($array); $i++)
{
   if ($array[$i] <= $key)
   $left_arr[] = $array[$i];
   else
   $right_arr[] = $array[$i];
}
$left_arr = quick_sort($left_arr);
$right_arr = quick_sort($right_arr);
return array_merge($left_arr, array($key), $right_arr);
}
$arr = array(49, 38, 65, 97, 76, 13, 27);
$aResule = quick_sort($arr);
print_r($aResule);
快速查找算法過程:
設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用第一個數據)作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序。一趟快速排序的算法是:
  1)設置兩個變量I、J,排序開始的時候:I=1,J=N-1;
  2)以第一個數組元素作爲關鍵數據,賦值給X,即 X=A[0];
  3)從J開始向前搜索,即由後開始向前搜索(J=J-1),找到第一個小於X的值,讓該值與X交換(找到就行.找到後i大小不變);
  4)從I開始向後搜索,即由前開始向後搜索(I=I+1),找到第一個大於X的值,讓該值與X交換(找到就行.找到後j大小不變);
  5)重複第3、4步,直到 I=J; (3,4步是在程序中沒找到時候j=j-1,i=i+1。找到並交換的時候i, j指針位置不變。另外當i=j這過程一定正好是i+或j+完成的最後另循環結束)
49   38   65   97   76   13   27         這裏49爲關鍵數據
27   38   65   97   76   13   49         從後往前查找找第1個小於關鍵數據49的數27並與49交換位置
27   38   49   97   76   13   65         從前往後查找找第1個大於關鍵數據49的數65並與49交換位置
27   38   13   97   76   49   65         從後往前查找找第1個小於關鍵數據49的數13並與49交換位置
27   38   13   49   76   97    65         從前往後查找找第1個大於關鍵數據49的數97並與49交換位置
至此,49到了這組數據的中間位置,不能再繼續查找下去。然後將該組數據分成以下三部分
{27   38   13}   49   {76   49   97}     {27   38   13}和{76    97   65}分別取出關鍵數據27、76按照以上方法排序
27   38   13      
13   38   27         從後往前查找找第1個小於關鍵數據27的數13並與27交換位置
13   27   38         從前往後查找找第1個大於關鍵數據27的數38並與27交換位置
到此,關鍵數據27到了中間位置,查詢結束。
76    97   65         從後往前查找找第1個小於關鍵數據76的數65並與76交換位置
65   76   97         到此,關鍵數據76到了中間位置,查詢結束。
最後三部分數據組合在一起,即爲快速查找的結果:
13   27   38   49   65   76   97
-------------------------------------

//插入排序(一維數組)
function insert_sort($arr){
     $count = count($arr);
     for($i=1; $i<$count; $i++){
         $tmp = $arr[$i];
         $j = $i - 1;
         while($arr[$j] > $tmp){
             $arr[$j+1] = $arr[$j];
             $arr[$j] = $tmp;
             $j--;
         }
     }
     return $arr;
}


●選擇排序(Selection Sort)的基本思想是:每一趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排好序的子文件的最後,直到全部記錄排序完畢。

//選擇排序(一維數組)
function select_sort($arr){
     $count = count($arr);
     for($i=0; $i<$count; $i++){
         $k = $i;
         for($j=$i+1; $j<$count; $j++){
             if ($arr[$k] > $arr[$j])
                 $k = $j;
             if ($k != $i){
                 $tmp = $arr[$i];
                 $arr[$i] = $arr[$k];
                 $arr[$k] = $tmp;
             }
         }
     }
     return $arr;
}


冒泡排序的基本思想是:兩兩比較待排序記錄的關鍵字,發現兩個記錄的次序相反時即進行交換,直到沒有反序的記錄爲止。

//冒泡排序(一維數組)
function bubble_sort($array){
     $count = count($array);
     if ($count <= 0) return false;
     for($i=0; $i<$count; $i++){
         for($j=$count-1; $j>$i; $j--){
             if ($array[$j] < $array[$j-1]){
                 $tmp = $array[$j];
                 $array[$j] = $array[$j-1];
                 $array[$j-1] = $tmp;
             }
         }
     }
     return $array;
} 


●快速排序實質上和冒泡排序一樣,都是屬於交換排序的一種應用。所以基本思想和上面的冒泡排序是一樣的。

//快速排序(一維數組)
function quick_sort($array){
	if (count($array) <= 1) return $array;
	$key = $array[0];
	$left_arr = array();
	$right_arr = array();
	for ($i=1; $i<count($array);$i++){   
		if ($array[$i] <= $key)
			$left_arr[] = $array[$i];	
		else		
			$right_arr[] = $array[$i];   
	}   
	$left_arr = quick_sort($left_arr);   
	$right_arr = quick_sort($right_arr);   
	return array_merge($left_arr, array($key), $right_arr);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章