算法學習--排序算法--快排

算法學習--排序算法--快排

快排算法

快速排序是系統中常用的排序方法,也是面試常考題目,快排的本質是利用空間解決時間問題,通過併發運算,解決運算耗時問題。快速排序本身需要比較的次數比冒泡會多,但是其遞歸的良好應用,使得排序效率極高。
具體做法(這裏的做法是主要針對我自己的代碼,與百度算法有一些區別):

  1. 從數組中取出關鍵數據,一般都是取第一個數據
  2. 將數組中的數據與關鍵數據進行對比,如果比關鍵數據大,則放入關鍵數組左側,反之放在右側
  3. 將左右兩側的數據再次進行第1、2步操作,直到所有數據排序完成

代碼實現

//這是百度的排序示例,這裏是直接對原數組進行排序,循環較多,而且不直觀。我自己改變了一下,讓他更容易理解
function qs($a, $s=0, $e=null) {
    if($e === null) {
        $e = count($a);
    }
    if($s >= $e) {
        return $a;
    }
     
    $j = $e-1; 
    $i = $s;
    $n = $a[$s];
    //$ac = $a;
    for(; $j>$i; $j--) {
        if($a[$j] < $n) {
            $t = $a[$i];
            $a[$i] = $a[$j];
            $a[$j] = $t;
            for($i++;$i<$j;$i++) {
                if($a[$i] > $n) {
                    $t = $a[$j];
                    $a[$j] = $a[$i];
                    $a[$i] = $t;
                    break;
                }
            }
        }
    }
    //printf("\n[%s], %s ~ %s [%s] %s-%s-%s", implode($ac, ','), $s, $e, implode($a, ','), $i, $j, $e);
    qs(&$a, $s, $i);
    qs(&$a, $i+1, $e);
    return $a;
}

//這是我的算法,下面的比較可以再簡化
function quickSort($array = array())
{
    global $time;
    if(count($array) <= 1) {
        return $array;
    }

    $temp = $array[0];
    $array_left = $array_right = $array_current = array();
    foreach ($array as $item) {
        $time++;
        if ( $item < $temp) {
            $array_left[] = $item;
        }
        if ( $item > $temp) {
            $array_right[] = $item;
        }
        if ( $item == $temp) {
            $array_current[] = $item;
        }
    }
    $array_right = quickSort($array_right);
    $array_left = quickSort($array_left);
    return array_merge($array_left,$array_current,$array_right);
}


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