排序算法

<?php
/*


* @author   zzp
* @time     2017/11/27
* @content  排序算法的类



 */










Class Sort
{
//权限修饰符 
//public 公共的 类内 类外 继承 都可调用
//private  私有的  只可以类内调用
//protected  受保护的  父类和子类 可以调用

//冒泡排序
//数组中相邻的两个数 依次比较大小 如果符合我们的条件则不变 不符合条件的调换两个数的位置

/*
@content 冒泡排序
@params  $arr array 需要排序的无序数组
@return  $arr array 排好序的有序数组
*/

public function BubbleSort($arr)
{
$len = count($arr);
//控制循环的层数
for ($i=1;$i<$len;$i++) {
//控制比较的次数
for ($j=0;$j<$len-$i;$j++) {
if ($arr[$j] > $arr[$j+1]) {
list($arr[$j],$arr[$j+1]) = [$arr[$j+1],$arr[$j]];
}
}
}


return $arr;
}




/*
@content 快速排序
@params  $arr array 需要排序的无序数组
@return  $arr array 排好序的有序数组
*/

public function QuickSort($arr)
{
$len = count($arr);
if ($len <=1) {
return $arr;
}
//定义我们的标杆
$base = $arr[0];
$big = [];
$small = [];
for ($i=1;$i<$len;$i++) {
if ($arr[$i] > $base) {
$big[] = $arr[$i];
} else {
$small[] = $arr[$i];
}
}
$left = $this->QuickSort($small);
$right = $this->QuickSort($big);
$arr = array_merge($left,[$base],$right);


return $arr;
}




/*
@content 获取不重复的三位数
@params  $arr array 长度为5的不重复索引数组
@returnn $data array  所有符合条件的数的集合
*/
public function GetNum($arr)
{
$len = count($arr);
$data = [];
for ($i=0;$i<$len;$i++) {
if ($arr[$i] ==0) continue;
for ($j=0; $j < $len; $j++) { 
for ($k=0; $k < $len ; $k++) { 
if ($arr[$i] !=$arr[$j] && $arr[$i] != $arr[$k] && $arr[$j] != $arr[$k]) {
$data[] = $arr[$i].$arr[$j].$arr[$k];
}
}
}
}


return $data;
}

/*
@content 选择排序
@params  $arr array  无序索引数组
@returnn $data array  排好序的有序数组
*/
public function SelectSort($arr)
{
$len = count($arr);
for ($i=0;$i<$len-1;$i++) {
//我们认为的最小值的位置
$min = $i;
for ($j=$i+1;$j<$len;$j++) {
if ($arr[$min] > $arr[$j]) {
$min = $j;
}
}
if($min != $i) {
list($arr[$min],$arr[$i]) = [$arr[$i],$arr[$min]];
}


}


return $arr;
}


/*
@content 插入排序
@params  $arr array   有序数组插入一个新元素后的结果
@returnn $arr array  排好序的有序数组
*/


public function InsertSort($arr)
{
$len = count($arr);


for ($i=1;$i<$len;$i++) {
for ($j=$i-1;$j>=0;$j--) {
if ($arr[$j] > $arr[$j+1]) {
list($arr[$j+1],$arr[$j]) = [$arr[$j],$arr[$j+1]];
} else {
break;
}
}
}


return $arr;
}




}


?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值