知乎:冒泡排序(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下是有優勢的。(如果蛋疼想知道具體內容,請去我主頁把那些關於sorting的paper看了就懂了。)
白如冰:
快排和二叉搜索樹本質上是一樣一樣的。
快排的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; }