php 排序算法

冒泡算法

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)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值