[PHP] 排序和查找算法


知乎:冒泡排序(bubble sort)的原理是什么?

 

潘屹峰:

冒泡排序的原理可以顧名思義:把每個數據看成一個氣泡,按初始順序自底向上依次對兩兩氣泡進行比較,對上重下輕的氣泡交換順序(這里用氣泡輕、重表示數據大、小),保證輕的氣泡總能浮在重的氣泡上面,直到最輕的氣泡浮到最上面;保持最后浮出的氣泡不變,對余下氣泡循環上述步驟,直到所有氣泡從輕到重排列完畢。

 

Nerd Leo

在實際項目中應該使用PHP自帶的庫函數。冒泡和快排要在大數據量下才有明顯的性能差異 。在幾個常用的小數據排序算法中,冒泡是實際效率最差的,選擇排序或插入排序

 

$nums=array(7,2,1,3,4,5,6);
$length=count($nums);
for($i=0;$i<$length;$i++){
    for($j=($length-1);$j>$i;$j--){
        if($nums[$j]<$nums[$j-1]){
            $temp=$nums[$j];
            $nums[$j]=$nums[$j-1];
            $nums[$j-1]=$temp;
        }
    }
}

 

 

知乎:想請教一下學算法的大神,快速排序和二叉樹排序哪個快一點?

本人對排序算法了解不多,但是大概知道快速排序和二叉樹排序的原理。兩者在排序速度上差別大嗎?懇請大神給我這個小白科普一下。

 

Yan Gu

首先,默認題主說串行的情形,我猜題主並不一定知道任何一個並行排序算法。

 

其次,搜索樹排序是一個general的概念,默認姑且為“隨機二叉搜索樹”。用它排序的computational DAG完全等價於快速排序(具體分析自己去看1987年那篇論文),但是雖然計算是完全一樣的,計算的順序卻大不相同,因而快排的cache locality要好的多得多(不懂請自行維基),所以會快得多。

 

當然二叉樹排序並不是沒有優點。他的最大優勢就在於並不是swap-based sorting。導致的缺點雖然是memory access pattern的導致有很多random access,但是優點是並不用頻繁的寫內存,於是在一些特殊setting下是有優勢的。(如果蛋疼想知道具體內容,請去我主頁把那些關於sortingpaper看了就懂了。)

 

白如冰:

快排和二叉搜索樹本質上是一樣一樣的。

快排的partion不就是分左右子樹么。

快速排序:

 

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);
    
}

 

二分查找:

function bin_sch($array, $low, $high, $k){
    if ($low <= $high){
        $mid = intval(($low+$high)/2);
        if ($array[$mid] == $k){
            return $mid;
        }elseif ($k < $array[$mid]){
            return bin_sch($array, $low, $mid-1, $k);
        }else{
            return bin_sch($array, $mid+1, $high, $k);
        }
    }
    return -1;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM