基本排序算法
- bubblesort 冒泡排序
- insertsort 插入排序
- shellsort 希尔排序
- selectsort 简单查找排序
- quicksort 快速排序
<?php
/*
* bubble的原理:数组的前两个数字对比
* 每次数字大的后移一位
* 如果数字的长度是10 需要最多排序9次
*/
function bubbleSort(array $numbers) {
$cnt = count($numbers);
// echo $cnt;exit;
for ($i = 0; $i < $cnt - 1; $i++) {
for ($j = 0; $j < $cnt - $i - 1; $j++) {
if ($numbers[$j] > $numbers[$j + 1]) {
$temp = $numbers[$j];
$numbers[$j] = $numbers[$j + 1];
$numbers[$j + 1] = $temp;
}
}
}
return $numbers;
}
/*
* insert_sort的原理
* 将数组分成两个区域,已经排序的区域和未排序的区域
* 直接套两层循环 区分区域 从未排序的区域取数到排序区域比较大小
*/
function insertsort(array $arr) {
for($i=1, $len=count($arr); $i<$len; $i++) {
$tmp = $arr[$i];
for($j=$i-1;$j>=0;$j--) {
if($tmp < $arr[$j]) {
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
break;
}
}
}
return $arr;
}
/*
* shell sort 希尔排序
* 高级的插入排序 shell是不稳定的排序
* 把数组通过增量分组 分组后再进行排序 通过增量 最后只剩下一组的方法
*/
function ShellSort(array $container)
{
$count = count($container);
//通过增量2将数组分成5个组 array的个数是10
for ($increment = intval($count / 2); $increment > 0; $increment = intval($increment / 2)) {
//对分开的5个组就行直接插入排序 直到increment循环到1
for ($i = $increment; $i < $count; $i++) {
$temp = $container[$i];
for ($j = $i; $j >= $increment; $j -= $increment) {
if ($temp < $container[$j - $increment]) {
$container[$j] = $container[$j - $increment];
} else {
break;
}
}
$container[$j] = $temp;
}
}
return $container;
}
/*
* select 排序方法
* 每次从带排序元素中取出最大或者最小的值放到起始位置
* 知道全部排完
* select排序是不稳定排序
*/
function SelectSort(array $container)
{
$count = count($container);
for ($i = 0; $i < $count; $i++){
$k = $i;
for ($j = $i + 1; $j < $count; $j++){
if($container[$j] < $container[$k]){
$k = $j;
}
}
if($k != $i){
$temp = $container[$i];
$container[$i] = $container[$k];
$container[$k] = $temp;
}
}
return $container;
}
/*
* quike sort
* 按基准排序 所有元素比基准小的元素排到前面
* 然后在前面和后面的元素中进行递归排序
*/
function QuickSort(array $container)
{
$count = count($container);
if ($count <= 1) {
return $container;
}
$pivot = $container[0];
$left = $right = [];
for ($i = 1; $i < $count; $i++) {
if ($container[$i] < $pivot) {
$left[] = $container[$i];
} else {
$right[] = $container[$i];
}
}
$left = QuickSort($left);
$right = QuickSort($right);
return array_merge($left, [$container[0]], $right);
}
$num = array(20, 40, 60, 80, 30, 70, 90, 10, 50, 100);
$res = SelectSort($num);
print_r($res);