四种排序算法

//冒泡排序法
function bubbleSort($array){
    for($i = 0;$i < count($array) -1;$i++){
        for($j = 0;$j < count($array) - 1 -$i;$j++){
            if($array[$j] > $array[$j+1]){  //从小到大排列
                $temp = $array[$j];
                $array[$j] = $array[$j+1];
                $array[$j+1] = $temp;
            }
        }
    }
    return $array;
}
//选择排序法
function selectSort($array){
    for($i = 0;$i < count($array) - 1;$i++){
        $min = $array[$i];  //假设$i就是最小值
        $minIndex = $i;
        for($j = $i+1;$j < count($array);$j++){
            if($min > $array[$j]){    //从小到大排列
                $min = $array[$j];     //找最小值
                $minIndex = $j;
            }
        }
        $temp = $array[$i];
        $array[$i] = $array[$minIndex];
        $array[$minIndex] = $temp;
    }
    return $array;
}
//插入排序法
function insertSort($array){  //从小到大排列
    //先默认$array[0],已经有序,是有序表
    for($i = 1;$i < count($array);$i++){
        $insert = $array[$i]; //$insert是准备插入的数
        $Index = $i - 1; //有序表中准备比较的数的下标
        while($Index >= 0 && $insert < $array[$Index]){
            $array[$Index + 1] = $array[$Index]; //将数组往后挪
            $Index--; //将下标往前挪,准备与前一个进行比较
        }
        if($Index + 1 !== $i){
            $array[$Index + 1] = $insert;
        }
    }
    return $array;
}
//递归快速排序法
function quickSort($array){
    if(!isset($array[1]))
        return $array;
    $mid = $array[0]; //获取一个用于分割的关键字,一般是首个元素
    $left = array();
    $right = array();
    $base = array();
    foreach($array as $v){
        if($v > $mid){
            $right[] = $v;  //把比$mid大的数放到一个数组里
        }else if($v < $mid){
            $left[] = $v;   //把比$mid小的数放到另一个数组里
      } else{       
            $base[] = $v;   //把分割的元素
    }  
        }
    $left = quickSort($left); //把比较小的数组再一次进行分割
    $right = quickSort($right);  //把比较大的数组再一次进行分割
    return array_merge($left,$base;$right);  //组合两个结果
}
//非递归快速排序
function quickSort($arr){
    $borderStack[] = [0, count($arr) - 1]; //数组边界
    while (!empty($borderStack))    
    {
        $border = array_pop($borderStack);
        $left = $border[0];
        $right = $border[1];
        $pivot = $arr[$left]; // 分界值            
        while ($left < $right)
        {
            while ($left<$right && $arr[$right] >= $pivot) 
                $right--;                
            $arr[$left] = $arr[$right];
            while ($left<$right && $arr[$left] < $pivot) 
                $left++;                               
            $arr[$right] = $arr[$left];
        }                        
        $arr[$left] = $pivot;            
        if ($border[0] < $left - 1) 
            $borderStack[] = [$border[0],$left-1];                        
        if ($border[1] > $left + 1) 
            $borderStack[] = [$left+1, $border[1]];        
    }        
    return $arr;    
} 

 

posted @ 2016-08-19 14:54  IT~民工  阅读(282)  评论(0编辑  收藏  举报