标签:
冒泡排序是非常容易理解和实现,,以从小到大排序举例:
设数组长度为N。
1.比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换。
2.这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。
3.N=N-1,如果N不为0就重复前面二步,否则排序完成。
方案一:
1 function bubble1_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 for($i=0;$i<$count;$i++){ 7 for($j=0;$j<$count;$j++){ 8 if($array[$i]<$array[$j]){ 9 $temp=$array[$i]; 10 $array[$i]=$array[$j]; 11 $array[$j]=$temp; 12 } 13 } 14 } 15 return $array; 16 }
方案二:
1 function bubble2_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 7 for($i=0;$i<$count;$i++){ 8 for($j=1;$j<$count-$i;$j++){ 9 if($array[$j-1]>$array[$j]){ 10 $temp=$array[$j-1]; 11 $array[$j-1]=$array[$j]; 12 $array[$j]=$temp; 13 } 14 } 15 } 16 return $array; 17 }
方案三:
设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。
1 function bubble3_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 $flag=true; 7 $j=$count; 8 while($flag){ 9 $flag=false; 10 for($i=1;$i<$j;$i++){ 11 if($array[$i-1]>$array[$i]){ 12 $temp=$array[$i-1]; 13 $array[$i-1]=$array[$i]; 14 $array[$i]=$temp; 15 $flag=true; 16 } 17 } 18 $j--; 19 20 } 21 return $array; 22 23 }
方案四:
如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
1 function bubble4_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 $flag=$count; 7 while($flag>0){ 8 $k=$flag; 9 $flag=0; 10 for($j=1;$j<$k;$j++){ 11 if($array[$j-1]>$array[$j]){ 12 $temp=$array[$j-1]; 13 $array[$j-1]=$array[$j]; 14 $array[$j]=$temp; 15 $flag=$j; 16 } 17 } 18 } 19 return $array; 20 }
方案五:
1 function bubble_sort($array){ 2 $count=count($array); 3 if($count<=1){ 4 return $array; 5 } 6 for($i=$count-1;$i>0;$i--){ 7 $flag=false; 8 for($j=0;$j<$count;$j++){ 9 if($array[$j]>$array[$j+1]){ 10 $temp=$array[$j]; 11 $array[$j]=$array[$j+1]; 12 $array[$j+1]=$temp; 13 $flag=true; 14 } 15 } 16 if(!$flag) 17 break; 18 } 19 return $array; 20 }
标签:
原文地址:http://www.cnblogs.com/CHEUNGKAMING/p/4377458.html