这篇文章上次修改于 339 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
冒泡排序
- 1、比较相邻的元素。如果第一个比第二个大,就交换它们两个;
- 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素就是最大的数;
- 3、排除最大的数,接着下一轮继续相同的操作,确定第二大的数...
- 4、重复步骤1-3,直到排序完成。
function bubbleSort( $data ){
if( count($data) <= 1){
return $data;
}
$len = count($data);
for( $i =0; $i < $len-1; $i++ ){
for($j=0; $j < $len - $i - 1; $j++){
if($data[$j] > $data[$j+1]){
$tmp = $data[$j];
$data[$j] = $data[$j+1];
$data[$j+1] = $tmp;
}
}
}
return $data;
}
//测试
$ar = [10,2,15,13,8,9,7,5];
print_r(bubbleSort($ar));
插入排序
- 1、从第一个元素开始,该元素可以认为已经被排序;
- 2、取出下一个元素,在前面已排序的元素序列中,从后向前扫描;
- 3、如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 5、将新元素插入到该位置后;
- 6、重复步骤2~5。
//插入排序
function insertSort( $data ){
if( count($data) <= 1){
return $data;
}
$len = count($data) - 1;
for( $i=0; $i < $len; $i++){
$nowValue = $data[$i+1]; //15
$preKey = $i; //1
while ($preKey >= 0 && $nowValue < $data[$preKey]){
$data[$preKey+1] = $data[$preKey];
$preKey--;
}
$data[$preKey+1] = $nowValue;
}
return $data;
}
$ar = [10,2,15,13,8,9,7,5];
print_r(insertSort($ar));
选择排序
- 1、第一轮,找到最小的元素,和数组第一个数交换位置。
- 2、第二轮,找到第二小的元素,和数组第二个数交换位置...
- 3、直到最后一个元素,排序完成。
//选择排序
function selectSort($data){
if( count($data) <= 1){
return $data;
}
$len = count($data) - 1;
$minKey = 0;
for( $i = 0; $i <= $len; $i++ ){
for( $j = $i; $j <= $len; $j++ ){
if( $data[$j] < $data[$minKey] ){
$minKey = $j;
}
}
if( $minKey != $i ){
$tmp = $data[$i];
$data[$i] = $data[$minKey];
$data[$minKey] = $tmp;
}
}
return $data;
}
$ar = [10,2,15,13,8,9,7,5];
print_r(selectSort($ar));
快速排序
- 1.从数列中挑出一个元素(通常是第一个元素),称为"基准"(pivot),
- 2.重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
- 3.递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序。
function fastSort(&$data, $start, $end){
if( count($data) <= 1){
return $data;
}
if($start > $end){
return $data;
}
$posData = $data[$start];
$left = $start;
$right = $end;
while ($left < $right){
while ($left < $right ){
if( $data[$right] > $posData ){
$right--;
}else{
break;
}
}
$data[$left] = $data[$right];
while ($left < $right ){
if( $data[$left] <= $posData ){
$left++;
}else{
break;
}
}
$data[$right] = $data[$left];
}
$data[$left] = $posData;
fastSort($data, $start, $left-1);
fastSort($data, $left+1, $end);
return $data;
}
$ar = [10,2,15,13,8,9,7,5];
print_r(fastSort($ar, 0, 7));
希尔排序
- 把数组分割成若干(h)个小组(一般数组长度length/2),然后对每一个小组分别进行插入排序。每一轮分割的数组的个数逐步缩小,h/2->h/4->h/8,并且进行排序,保证有序。当h=1时,则数组排序完成。
//希尔排序
function shellSort($data){
if( count($data) <= 1){
return $data;
}
$len = count($data);
$gap = floor($len/2);
while ($gap > 0){
for($i = $gap; $i < $len; $i++){
$temp = $data[$i];
$preKey = $i - $gap;
while ($preKey >= 0 && $temp < $data[$preKey]){
$data[$preKey + $gap] = $data[$preKey];
$preKey -= $gap;
}
$data[$preKey+$gap] = $temp;
}
$gap /= 2;
}
return $data;
}
$ar = [10,2,15,13,8,9,7,5];
print_r(shellSort($ar));
没有评论
博主关闭了评论...