基本思路:两两比较待排序记录的关键字,如果发现两个记录的次序相反就进行交换,直到所有记录都没有反序时为止。
两种交换排序算法:冒泡排序和快速排序
冒泡排序(Bubble Sort)的基本思路:通过相邻元素之间的比较和交换,使关键字最小的元素逐渐从底部移向顶部。每趟排序都将最小的元素,放在第一位,接着再在下一趟排序找到最小的记录,下一趟排序的比较次数少1次。
冒泡排序的时间复杂度是:n 的二次方
';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";