主要都是自己写的,有些是参考了其他语言版的代码写出来的,只当做记录
/////冒泡大数下沉
function bubblesortBig($arr){
$len = count($arr);
for($i =$len-1 ;$i>0;$i--){
for($j = 0;$j<$i;$j++){
if($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
/////冒泡小数上升
function bubblesortsmall($arr){
$len = count($arr);
for($i = 0;$i<$len;$i++){
for($j = $len-1;$j>$i;$j--){
if($arr[$j]<$arr[$j-1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $temp;
}
}
}
return $arr;
}
////希尔排序
function shellsort($arr){
$len = count($arr);
$gap = $len;
while($gap >1){
$gap = floor($gap /2);
do{
$exchange = 0;
for($i = 0 ;$i < $len -$gap;$i++){
if($arr[$i]>$arr[$i+$gap]){
$temp = $arr[$i+$gap];
$arr[$i+$gap] = $arr[$i];
$arr[$i] = $temp;
$exchange = 1;
}
}
}while($exchange != 0);
}
return $arr;
}
//快速排序
function quicksort($arr){
if (count($arr) <= 1) return $arr; ///这句必须,用于结束递归
$len = count($arr);
$key = $arr[0];
$left = array();
$right = array();
for($i = 1 ;$i<$len ;$i++){
if($arr[$i] >$key){
$right[] = $arr[$i];
}else{
$left[] = $arr[$i];
}
}
$left = quicksort($left);
$right = quicksort($right);
$new = array_merge($left,array($key),$right);
return $new;
}
//选择排序
function selectsort($arr){
$len = count($arr);
for($i = 0 ;$i <$len ;$i++){
$key = $i;
for($j = $i;$j <$len;$j++){
if($arr[$key]>$arr[$j]){
$key = $j;
}
}
if($key != $i){
$temp = $arr[$key];
$arr[$key] = $arr[$i];
$arr[$i] = $temp;
}
}
return $arr;
}
////插入排序
function insertsort($arr){
$len = count($arr);
for($i = 1;$i <$len;$i++){
$key = $arr[$i];
$j = $i;
while($j >0 && $arr[$j-1]>$key){
$arr[$j] = $arr[$j-1];
$j--;
}
$arr[$j] = $key;
}
return $arr;
}
/////桶排序
function bucketsort($arr){
//$len = count($arr);
$box = array();
foreach($arr as $val){
$box[$val][]=$val;
}
$min = min($arr);
$max = max($arr);
$new = array();
for($i = $min;$i<=$max;$i++){
if(isset($box[$i])){
$new = array_merge($new,$box[$i]);
}
}
return $new;
}
///堆排序
function MaxHeap($arr,$len,$i){
$mid = $i;
$left = 2*$i;
$right = 2*$i+1;
if($left < $len){
if($arr[$mid] <$arr[$left]){
$mid = $left;
}
}
if($right <$len){
if($arr[$mid] < $arr[$right]){
$mid = $right;
}
}
if($i != $mid){
$temp = $arr[$i];
$arr[$i] = $arr[$mid];
$arr[$mid] = $temp;
}
return $arr;
}
function buildHeap($arr,$len){
for($i = floor($len/2)-1;$i>=0;$i--){
$arr = MaxHeap($arr,$len,$i);
}
return $arr;
}
function heapsort($arr){
$len = count($arr);
$arr=buildHeap($arr,$len);
for($i=$len-1;$i >0;$i--){
$temp = $arr[$i];
$arr[$i] = $arr[0];
$arr[0] = $temp;
$arr=buildHeap($arr,$i);
}
return $arr;
}
////计数排序
function sort_counting($arr) {
$min = min($arr);
$max = max($arr);
$count = array();
for($i = $min ; $i <= $max; $i++ ) {
$count[$i] = 0;
}
foreach ($arr as $v) {
$count[$v] = $count[$v]+1;
}
foreach ($count as $k => $c) {
for($i = 0 ; $i < $c; $i++ ) {
$ret[] = $k;
}
}
return $ret;
}
//归并排序
function merge(&$arr,$start,$mid,$end) {
$i = $start;
$j = $mid+1;
$ary = array();
while($i <= $mid && $j <= $end) {
if($arr[$i] <= $arr[$j]) {
$ary[] = $arr[$i++];
} else {
$ary[] = $arr[$j++];
}
}
while($i <= $mid) {
$ary[] = $arr[$i++];
}
while($j <= $end) {
$ary[] = $arr[$j++];
}
for($i = 0 ;$i < count($ary);$i++) {
$arr[$i + $start] = $ary[$i];
}
}
function merge_sort(&$array,$low,$high) {
if($low < $high) { // 任何递归都要有边界,否则就是死循环
$mid = floor(($low+$high) / 2);
merge_sort($array,$low,$mid);
merge_sort($array,$mid+1,$high);
merge($array,$low,$mid,$high);
}
}
///插入排序
function insert_sort2($array){
$num = count($array);
for( $i = 1;$i < $num;$i++ ){
$temp = $array[$i];
$j = $i;
while($j > 0 && $array[ $j -1] >$temp){
if ($array[$j-1] > $array[$j]){
$array[$j] = $array[$j-1];
$j--;
}
$array[$j] = $temp;
}
}
return $array;
}
function insertsort($arr){
$len = count($arr);
for($i = 1;$i<$len;$i++){
$temp = $arr[$i];
$j = $i;
while($j > 0){
if($arr[$j-1]>$temp){
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $temp;
}
$j--;
}
}
return $arr;
}
///二分插入排序
function halfinsertsort($array){
$len = count($array);
for($i = 1;$i < $len;$i++){
$temp = $array[$i];
$low = 0;
$high = $i-1;
while($low <= $high){
$mid = floor(($low + $high)/2);
if($array[$mid] > $temp){
$high = $mid-1;
}else{
$low = $mid+1;
}
}
for($j = $i-1;$j >= $low;$j--){
$array[$j+1] = $array[$j];
}
$array[$low] = $temp;
var_dump($array);
echo "<br/>";
}
return $array;
}