冒泡等幾種排序算法(php)

1,冒泡排序
第一次循環是排序的次數,也可以理解爲已經排好的個數,從數組的開頭開始循環,第二次的循環是從尾部開始向上循環,也就是冒泡的過程,遇到排好的就終止( j> i).

public function ranger(){
        $argc = array(65,45,94,11,16);
        for ($i = 0; $i<count($argc)-1; $i++){
            $flag = false;
            for ($j = count($argc)-1; $j>$i; $j--){
                if($argc[$j]<$argc[$j-1]){
                    $temp = $argc[$j-1];
                    $argc[$j-1] = $argc[$j];
                    $argc[$j] = $temp;
                    $flag = true;
                }
            }
            if(!$flag) break;
        }
        print_r($argc);
    }

2,選擇排序,第一次循環,從0開始,往後開始循環,假設當前下標最小,記錄當前下標值。第二次循環,從第一個循環的下一個開始($i+1,連鎖反應是$j<count($argc)不需要減一),往後面的排,兩兩比較選擇第二次循環的最小下標,退出第二次循環之後,判斷最小下標是否和之前的下標相等,不等則交換數據。

public function ranger(){
        $argc = array(65,45,94,11,16);
        for( $i = 0 ;$i<count($argc)-1;$i++){
            $min = $i;
            for ($j = $i+1;$j<count($argc);$j++){//注意這裏不需要減一
                if($argc[$j]<$argc[$j-1]){
                    $min = $j;
                }
            }
            if($min!=$j){
                $temp = $argc[$i];
                $argc[$i] = $argc[$min];
                $argc[$min] = $temp;
            }
        }
        print_r($argc);
    }

3,插入排序,第一次循環同理,第二遍循環,由於插入排序是默認已經錢n-1個已經排好序,所以第二次循環起始點爲$j = $i+1,往前進行排序,臨界點是$j>0,對裏面的數據進行大小判斷,並且交換數據。我的理解是插入排序是把下一個數據拉進排序即可。

public function ranger()
    {
        $argc = array(65, 45, 94, 11, 16);
        for($i = 0;$i<count($argc)-1;$i++){
            for ($j = $i+1;$j>0;$j--){
                if($argc[$j]<$argc[$j-1]){
                    $temp = $argc[$j-1];
                    $argc[$j-1] = $argc[$j];
                    $argc[$j] = $temp;
                }
            }
        }
        print_r($argc);
    }

4,快速排序

public function ranger($l,$r,$argc)
    {

        $key = $argc[1];
        if($l>=$r) return;
        while ($l<$r){
            while ($argc[$r]>=$key) $r--;
            if ($l<$r){
                $argc[$l] = $argc[$r];
                $l++;

            }
            while ($argc[$l]<$key) $l++;
            if ($l<$r){
                $argc[$r] = $argc[$l];
                $r--;
            }

        }
        $argc[$l] = $key;
        $this->ranger($l,$r-1,$argc);
        $this->ranger($l+1,$r,$argc);
    }
    public function sel(){
        $this->ranger(0,4,$argc = array(65, 45, 94, 11, 16));
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章