冒泡等几种排序算法(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));
    }
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注