描述:
从一个数组根据"找最大值"的事理, 找出个中的最大值, 以及其位置。
并将该单元的值跟该数组的末了一个位置的值进行交流——就可以得到一个最大值并放在末了位置。
连续(第2趟), 将数组的剩余部分连续以相同的做法, 就有可以确定一个在这个部分中的最大值, 并放在末了位置。
再连续, 依次类推, 就可以一次次减少要找最大值的数据范围, 直到末了剩一个, 就不须要了!
$a = array( 12, 18, 8, 22, 32, 11);
推演:
第1趟:array( 12, 18, 8, 22, 11, 32);
第2趟:array( 12, 18, 8, 11, 22, 32);
第3趟:array( 12, 11, 8, 18, 22, 32);
第4趟:array( 8, 11, 12, 18, 22, 32);
第5趟:array( 8, 11, 12, 18, 22, 32);
规律总结:
1 首先, 该当先得到数组单元的总数n: count()函数可知;
2 要找出个中最大值及其下标的趟数为n-1;
3 每一趟所要从中找的数据的个数比前一趟少1个, 且第一趟要从n个数据中找。
4 每一趟结束后, 都须要交流:将找到的最大值单元跟这一趟中的末了一项进行交流;
实例: 选择排序
<?php$a = array( 12, 18, 8, 22, 32, 11);$n = count($a);echo "<br />排序前:";print_r($a);for($i = 0; $i < $n-1; ++$i){//掌握趟数: $max = $a[0]; //每一趟都取得第一个数据; $pos = 0; //并取得对应的下标(这里自然是0) for($k = 0; $k < $n-$i; ++$k){ //将$k看做是数组的下标,从0开始,代表所有要找最大值的下标范围 if($a[$k] > $max){ $max = $a[$k]; $pos = $k; } } //只有上面for循环结束,才算找到了这一趟中的最大值及其下标 //然后才开始去进行交流:该最大值跟这一趟的末了一项进行交流 $tmp = $a[$pos]; $a[$pos] = $a[$n-$i-1];//每一趟的末了一个位置是$n-$i-1 $a[$n-$i-1] = $tmp;}echo "<br />排序后:";print_r($a);?>
冒泡排序:
描述:
将一个数组从前今后, 紧挨着的2个数据两两进行比较, 只要创造前面的比后面的大, 就将他们交流位置, 这样从前往后进行一趟之后,
就可以得到一个最大值放在这个数组的末了位置。
按此过程, 将数组的剩余部分连续进行相同的比较和交流过程, 又可以得到一个"最大值"放在末了。
依次类... 推每趟都可以得到一个剩余部分数据的最大值, 并放在剩余部分的末了位置。
结果, 终极会将所有数据排好。
$a = array( 12, 18, 8, 22, 32, 11);
推演:
第1趟:array( 12, 8, 18, 22, 11, 32);
第2趟:array( 8, 12, 18, 11, 22, 32);
第3趟:array( 8, 12, 11, 18, 22, 32);
第4趟:array( 8, 11, 12, 18, 22, 32);
第5趟:array( 8, 11, 12, 18, 22, 32);
总结规律:
1 假设数组有n项:有count()函数可得到;
2 从前今后挨个比较的趟数为:n-1趟
3 每一趟要比较的次数为都比前一趟少1,并且,第一趟须要比较 n-1 次
4 每次进行比较的时候,都是紧挨着的相邻的2个单元的值,如果前项大于后项,则须要交流;
实例: 冒泡排序
<?php$a = array( 12, 18, 8, 22, 32, 11);$n = count($a);echo "<br />排序前:";print_r($a);for($i = 1; $i <= $n-1; ++$i){//用于掌握比较的趟数(n-1趟) for($k = 0; $k < $n-1-$i; ++$k){ //用于掌握一趟中比较的次数 //把$k当做下标,则比较的是$k和$k+1这个单元的数据 if($a[$k] > $a[$k+1]){//前一项大于后一项,须要交流: $tmp = $a[$k]; $a[$k] = $a[$k+1]; $a[$k+1] = $tmp; } }}echo "<br />排序后:";print_r($a);//这里先来研究交流的做法://两个变量值的交流:$v1 = 3;$v2 = 4;$temp = $v1;$v1 = $v2;$v2 = $temp;//数组中2个单元的值的交流:$b = array(12, 22, 32);//目标:将12和32数据进行交流(其下标分别是0和2)$temp = $b[0];$b[0] = $b[2];$b[2] = $temp;?>
编写自定义函数:
<?phpfunction insert_sort($arr){ //插入排序法 $len=count($arr); for($i=1; $i<$len; $i++) { //获得当前须要比较的元素值。 $tmp = $arr[$i]; //内层循环掌握 比较 并 插入 for($j=$i-1; $j>=0; $j--) { //$arr[$i]; //须要插入的元素; $arr[$j]; //须要比较的元素 if($tmp < $arr[$j]) { //创造插入的元素要小,交流位置 //将后边的元素与前面的元故旧换 $arr[$j+1] = $arr[$j]; //将前面的数设置为 当前须要交流的数 $arr[$j] = $tmp; } else { //如果碰到不须要移动的元素 //由于是已经排序好是数组,则前面的就不须要再次比较了。 break; } } } //将这个元素 插入到已经排序好的序列内。 //返回 return $arr;}$arr=array(54,1,43,62,21,66,32,78,36,76,0,17,39,-1);echo '<pre>';print_r(insert_sort($arr));echo "</pre>";?>