折騰算法之—快速排序交換次數

昨天在閃存上求到了這道算法題。算法

本學渣剛看到快速排序的時候一點印象都沒有(辛苦培養個人高數老師,母校,祖國我對不起大家),因而百科了下快速排序的計算方法:數組

    1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
    2)以第一個數組元素做爲關鍵數據,賦值給 key,即 key=A[0];
    3)從j開始向前搜索,即由後開始向前搜索(j--),找到第一個小於 key的值A[j],將A[j]和A[i]互換;
    4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於 key的A[i],將A[i]和A[j]互換;
    5)重複第三、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於 key,4中A[i]不大於 key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到爲止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程必定正好是i+或j-完成的時候,此時令循環結束)。
好吧,雖然看起來有點複雜,但仍是很好理解的。
 
百科還給出了各類語言的算法,PHP是這樣的:
function quick($arr){                          
    $size=count($arr);
    if($size>1){
        $arr_1=array();
        $arr_2=array();
        for($i=1;$i<$size;$i++){
            if($arr[$i]<$arr[0]){
                $arr_1[]=$arr[$i];
            } else{
                $arr_2[]=$arr[$i];}
        }
        $arr_1=quick($arr_1)
        $arr_2=quick($arr_2);
        return array_merge($arr_1,array($arr[0]),$arr_2);
    } else{
        return $arr;
    }
}
$arr=array(99,233,1,32,54,234,456,54,34,1);
print_r(quick($arr));

可是這段代碼卻沒有嚴格按照快速排序的思路來,而是討巧的將數組第一個元素依次和後面的元素相比較,大的和小的分別放到不一樣數組裏,和快速排序的比較交換位位置有所不一樣,這就體現出用計算機計算和人類計算不同得地方了,不過他們的目的都是同樣的:將小的和大的分開來,而後經過遞歸完成排序。函數

學渣表示此次腦洞開的有點大:ui

function quick($arr,&$count){            //參數前加&爲引用形式,可以改變函數外的變量
   $size=count($arr);
   $a=0;                               
   $b=$size-1;
  if($size>1){ | $n=0; | while($a<$b){ | | $count_1=$count; | | for($i=$b;$i>$a;$i--){ //第一次查找交換 | | | if($arr[$a]>$arr[$i]){ | | | | $b=$i; | | | | $n=$b; | | | | $k=$arr[$a]; | | | | $arr[$a]=$arr[$i]; | | | | $arr[$b]=$k; | | | | $count++; | | | | break; | | | } | | } | | for($j=$a;$j<$b;$j++){ //第二次查找交換 | | | if($arr[$b]<$arr[$j]){ | | | | $a=$j; | | | | $n=$a; | | | | $k=$arr[$a]; | | | | $arr[$a]=$arr[$b]; | | | | $arr[$b]=$k; | | | | $count++; | | | | break; | | | } | | } | | if($count==$count_1){break;} //兩次都沒有交換說明這次循環完成 | } | | $arr_1=array_slice($arr,0,$n); | | $arr_1=quick_1($arr_1,$count); | | $arr_2=array_slice($arr,$n+1,$size-$n-1); | | $arr_2=quick_1($arr_2,$count);
| | return array_merge($arr_1,array($arr[$n]),$arr_2); }else{ | return $arr; } }
$count=0; //count用來統計交換次數
$arr=array(5,8,9,4,3);
$result=quick($arr,$count);
echo "count:".$count." resulte:";print_r($result);
相關文章
相關標籤/搜索