冒泡算法
function bubbleSort($ numbers) {
$ cnt = count($ numbers);
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;
}
array(20, 40, 60, 80, 30, 70, 90, 10, 50, 0);
var_dump(bubbleSort($num));
算法稳定性
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
选择排序
function selectionSort($arr)
{
$len = count($arr);
for ($i = 0; $i < $len - 1; $i++) {
$minIndex = $i;
for ($j = $i + 1; $j < $len; $j++) {
if ($arr[$j] < $arr[$minIndex]) {
$minIndex = $j;
}
}
$temp = $arr[$i];
$arr[$i] = $arr[$minIndex];
$arr[$minIndex] = $temp;
}
return $arr;
}
原理: 在一列数字中,选出最小数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。(以下都是升序排列,即从小到大排列)
插入排序
function insert_sort($ arr) {
//获取数组单元个数
$ count = count($ arr);
//外层循环用于从未排序区域中取出待排序元素
for ($ i=1; $ i < $ count; $ i++) {
//获取当前需要插入已排序区域的元素值
$ temp = $ arr[$ i];
//内层循环用于从已排序区域寻找待排序元素的插入位置
for ($ j=$ i-1; $ j >= 0; $ j--) {
//如果$ arr[$ i]比已排序区域的$ arr[$ j]小,就后移$ arr[$ j]
if ($ temp < $ arr[$ j]) {
$ arr[$ j+1] = $ arr[$ j];
$ arr[$ j] = $ temp;
} else {
//如果$ arr[$ i]不小于$ arr[$ j],则对已排序区无需再排序
break;
}
}
}
return $arr;
}
$ arr = array(6, 19, 26, 62, 88, 99, 18, 16, 1);
var_dump(insert_sort($arr));
直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。