数组中的排序

//冒泡排序法:封装函数
function bubbleSort(&$arr) {   //取地址而不是复制产生新的内存
    $temp = 0;  //临时变量,做交换使用
    //外层循环 循环数组元素的n-1个
    for ($i = 0; $i < count($arr) - 1; $i++) {
        //内层循环  当外层循环开始时 内层循环在外层内起作用,所以次数不会减去外层循环
        for ($j = 0; $j < count($arr) - 1 - $i; $j++) {
            //从小到大排列:当前面那个数小于后面那个数时  交换
            if ($arr[$j] > $arr[$j + 1]) {
                $temp = $arr[$j];
                //先把前面那个大的数保存起来
                $arr[$j] = $arr[$j + 1];
                //再把后面的哪个数复制给前面那个数
                $arr[$j + 1] = $temp;
                //然后把保存的那个大的数赋值给后面那个数
            }
        }
    }
}
$rr=array(34,65,221,-23,0,36,-100);
bubbleSort($rr);

print_r($rr);

//选择排序法
function selectSort(&$arr){
    $temp=0;
    for ($i=0; $i < count($arr)-1; $i++) {
        //假设$i是最小的值
        $minVal=$arr[$i];
        $minIndex=$i;  //记下最小值的下标
        for($j=$i+1;$j<count($arr),..,;$j++){
            if($minVal>$arr[$j]){  //假设不成立
                $minVal=$arr[$j];
                $minIndex=$j;
            }
        }
        //最后交换
        $temp=$arr[$i];
        $arr[$i]=$arr[$minIndex];
        $arr[$minIndex]=$temp;
    }

}


//插入排序法:将待插入的数看成一个整体,依次和前面的数比较,知道找到合适位置
function insertSort(&$arr) {
    //假设第一个数是有序的,从第二个数开始
    for ($i = 1; $i < count($arr); $i++) {
        $insertVal = $arr[$i];
        //待插入的数$insertVal
        $insertIndex = $i - 1;
        //待插入的位置是待插入数的前一位
        //当待插入位置不是第一个,并且待插入的值小于他前面待插入位置对应的值
        while ($insertIndex >= 0 && $insertVal < $arr[$insertIndex]) {
            //将待插入位置对应的值向后移
            $arr[$insertIndex+1] = $arr[$insertIndex];
            //待插入位置相应的应该向前移以为和更前一位比较,一次循环找到合适位置插入
            $insertIndex--;
        }
        //插入
        $arr[$insertIndex+1] = $insertVal;
    }

}

insertSort($rr);


//快速排序法:以中间那个数为标准,比他小的排到左边,大的排到右边,然后以此细化
$rr = array(-55, -10,1);
function quickSort($left, $right, &$arr) {
    $l = $left;
    $r = $right;
    
    $pivot = $arr[($l + $r) / 2];
    /*$pivot = ($l + $r) / 2;*/
  print_r($pivot);
   
    $temp = 0;
    while ($l <$r) {
        while ($arr[$l] < $pivot) {
            $l++;   //1
        }
        while ($arr[$r] > $pivot) {
            $r--;
        }
        
        if ($l >= $r) {
            break;
        }
        /*print_r($arr[$l]);
        print_r($arr[$r]);*/
        $temp = $arr[$l];
        $arr[$l] = $arr[$r];
        $arr[$r] = $temp;
       
        if ($arr[$l] == $pivot) {
            --$r;   //0
        }
        if ($arr[$r] == $pivot) {
            ++$l;   //1
        }
 
    }
    if ($l == $r) {
        $l++;   //2
        $r--;   //0
    }
    
    if ($left < $r) {
        
        quickSort($left, $r, $arr);
    }
    if ($right > $l) {
        quickSort($l, $right, $arr);
    }
}

quickSort(0,count($rr)-1,$rr);
print_r($rr);

posted @ 2018-02-25 22:28  smartwange  阅读(28)  评论(0)    收藏  举报