演示数组为:
$a = array(9, 3, 5, 8, 2, 7); //下标为0,1,2,3,4,5
演算过程描述:
求得一个数组的最大值的下标,并将这个最大值下标的单元跟最后一个单元进行交换;
然后,继续从剩余数据中取得最大值的下标,并将这个最大值下标的单元跟剩余的最后一个单元交换
以此类推,直到只剩下一个数据,就不用找了。
演示:
原始数组: |
9 |
3 |
5 |
8 |
2 |
7 |
第1趟后: |
7 |
3 |
5 |
8 |
2 |
9 |
第2趟后: |
7 |
3 |
5 |
2 |
8 |
9 |
第3趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
第4趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
第5趟后: |
2 |
3 |
5 |
7 |
8 |
9 |
规律描述:
1,假设数组的数据有n个。
2,要进行查找最大值单元并进行交换的“趟数”为n-1;
3,每一趟都要求出“剩余数据”中的最大值单元,并且,剩余数据的数量每一趟都少1个,第一趟有n个。
4,每一趟找出最大值单元后,都要进行交换:最大值单元,跟剩余数据中的最后一个单元交换。
代码演示如下:
<?php $a = array(9, 3, 5, 8, 2, 7); //下标为0,1,2,3,4,5 /* 规律描述: 1,假设数组的数据有n个。 2,要进行查找最大值单元并进行交换的“趟数”为n-1; 3,每一趟都要求出“剩余数据”中的最大值单元,并且,剩余数据的数量每一趟都少1个,第一趟有n个。 4,每一趟找出最大值单元后,都要进行交换:最大值单元,跟剩余数据中的最后一个单元交换。 */ echo "<br/>排序之前:"; print_r($a); //一顿排序。。。。。 $n = count($a); for($i = 0; $i < $n - 1; ++$i){//趟数 //每一趟开始找其中的最大值单元: $max = $a[0]; //找最大值先要取得第一项的值 $pos = 0; //找最大值的下标,也要先取得第一项的下标 for($k = 0; $k < $n-$i; ++$k){//注意这里和冒泡的区别:一个是比较次数一个是剩余个数! //这里,$k也可以理解为下标 if($a[$k] > $max){ $max = $a[$k]; $pos = $k; } } //前面一定可以获得最大值及其所在下标:即最大值单元 //然后开始i进行交换: $t = $a[$pos]; //最大值的单元 $a[$pos] = $a[$n-$i-1];//$n-$i-1就是剩余数据中的最后一个单元的下标! $a[$n-$i-1] = $t; } echo "<br/>排序之后:"; print_r($a); ?>