1,冒泡排序
第一次循环是排序的次数,也可以理解为已经排好的个数,从数组的开头开始循环,第二次的循环是从尾部开始向上循环,也就是冒泡的过程,遇到排好的就终止( j> i).
public function ranger(){
$argc = array(65,45,94,11,16);
for ($i = 0; $i<count($argc)-1; $i++){
$flag = false;
for ($j = count($argc)-1; $j>$i; $j--){
if($argc[$j]<$argc[$j-1]){
$temp = $argc[$j-1];
$argc[$j-1] = $argc[$j];
$argc[$j] = $temp;
$flag = true;
}
}
if(!$flag) break;
}
print_r($argc);
}
2,选择排序,第一次循环,从0开始,往后开始循环,假设当前下标最小,记录当前下标值。第二次循环,从第一个循环的下一个开始($i+1,连锁反应是$j<count($argc)
不需要减一),往后面的排,两两比较选择第二次循环的最小下标,退出第二次循环之后,判断最小下标是否和之前的下标相等,不等则交换数据。
public function ranger(){
$argc = array(65,45,94,11,16);
for( $i = 0 ;$i<count($argc)-1;$i++){
$min = $i;
for ($j = $i+1;$j<count($argc);$j++){//注意这里不需要减一
if($argc[$j]<$argc[$j-1]){
$min = $j;
}
}
if($min!=$j){
$temp = $argc[$i];
$argc[$i] = $argc[$min];
$argc[$min] = $temp;
}
}
print_r($argc);
}
3,插入排序,第一次循环同理,第二遍循环,由于插入排序是默认已经钱n-1个已经排好序,所以第二次循环起始点为$j = $i+1
,往前进行排序,临界点是$j>0
,对里面的数据进行大小判断,并且交换数据。我的理解是插入排序是把下一个数据拉进排序即可。
public function ranger() {
$argc = array(65, 45, 94, 11, 16);
for($i = 0;$i<count($argc)-1;$i++){
for ($j = $i+1;$j>0;$j--){
if($argc[$j]<$argc[$j-1]){
$temp = $argc[$j-1];
$argc[$j-1] = $argc[$j];
$argc[$j] = $temp;
}
}
}
print_r($argc);
}
4,快速排序
public function ranger($l,$r,$argc) {
$key = $argc[1];
if($l>=$r) return;
while ($l<$r){
while ($argc[$r]>=$key) $r--;
if ($l<$r){
$argc[$l] = $argc[$r];
$l++;
}
while ($argc[$l]<$key) $l++;
if ($l<$r){
$argc[$r] = $argc[$l];
$r--;
}
}
$argc[$l] = $key;
$this->ranger($l,$r-1,$argc);
$this->ranger($l+1,$r,$argc);
}
public function sel(){
$this->ranger(0,4,$argc = array(65, 45, 94, 11, 16));
}