交换排序

基本思路:两两比较待排序记录的关键字,如果发现两个记录的次序相反就进行交换,直到所有记录都没有反序时为止。

 

两种交换排序算法:冒泡排序和快速排序

 

冒泡排序(Bubble Sort)的基本思路:通过相邻元素之间的比较和交换,使关键字最小的元素逐渐从底部移向顶部。每趟排序都将最小的元素,放在第一位,接着再在下一趟排序找到最小的记录,下一趟排序的比较次数少1次。

 

冒泡排序的时间复杂度是:n 的二次方

<?php
/**
 * 冒泡排序:通过相邻元素之间的比较和交换,使关键字较小的元素逐渐从底部移向顶部。
 *
 */
$arr = [ 5,3,1,4,6,2,8,7,9,0];
$len = count($arr);
echo '升序排列===>';
echo "\r\n";
function bubble($arr,$len){
    $tmp = 0;
    for( $i = 1; $i<$len ; $i++){ // 只要进行len-1次排序,因为是用最后的元素和前一元素比较
        $flag = 0 ;    //标记剩余元素是否需要继续排序。
        for( $j = $len - 1; $j >= $i; $j--){
            if( $arr[$j] < $arr[$j-1] ){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j-1];
                $arr[$j-1] = $tmp;
                $flag = 1;
            }
        }
        if( !$flag ) return;  //如果该趟排序没有反序的元素,则排序结束。
    }
    return $arr;
}
$arr = bubble($arr,$len);
print_r($arr);
echo "\r\n";
function rbubble($arr,$n){
    $tmp = 0;
    for( $i = 1; $i<$n; $i++){
        for( $j = $n-1; $j >= $i; $j--){
            if( $arr[$j] > $arr[$j-1] ){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j-1];
                $arr[$j-1] = $tmp;
            }
        }
    }
    return $arr;
}
echo '降序排列==>';
$arr = rbubble($arr,$len);
print_r($arr);
echo "\r\n";

双向冒泡排序:

echo '双向冒泡===>';
function t_bubble($arr,$n){
    $i = 1;
    $j = 0;
    $noswap = 1;
    $tmp = 0;
    while($noswap){  //每循环一次将最小值放在开头,将最大值放在开头。下次循环在剩余的值内找到最小值和最大值
        $noswap = 0;
        //自底向上比较
        for( $j = $n-$i ; $j >= $i; $j--){
            if( $arr[$j] < $arr[$j-1] ){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j-1];
                $arr[$j-1] = $tmp;
                $noswap = 1;
            }
        }
        //自上向下比较
        for( $j = $i ; $j < $n-$i;$j++){
            if( $arr[$j] > $arr[$j+1] ){
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $tmp;
                $noswap = 1;
            }
        }
        $i++;
    }
    return $arr;
}
$arr = t_bubble($arr,$len);
print_r($arr);
echo "\r\n";

 

posted @ 2017-03-09 10:15  犀利瓜  阅读(121)  评论(0编辑  收藏  举报