排序算法

一、插入排序
  • 算法思想:每步将一个待排序的值,按其值的大小插入前面已经排完序的序列中适当的位置上,直到全部插入完为止。(稳定排序)
  • 排序过程:(默认升序)
    • 原始数据:5,2,1,3,7,4
    • 第一次排序(待排序值:2):{5,5},1,3,7,4{2,5},1,3,7,4
    • 第二次排序(待排序值:1):{2,5,5},3,7,4{2,2,5},3,7,4{1,2,5},3,7,4
    • 第三次排序(待排序值:3):{1,2,5,5},7,4{1,2,3,5},7,4
    • 第四次排序(待排序值:7):{1,2,3,5,7},4
    • 第五次排序(待排序值:4):{1,2,3,5,7,7}{1,2,3,5,5,7}{1,2,3,4,5,7}
  • 算法代码:
<?php

$array = array(5, 2, 1, 3, 7, 4);
print_r(insertSort($array));

function insertSort($array)
{
    $n = count($array);
    for ($i = 1; $i < $n; $i++) {
        $temp = $array[$i];
        for ($j = $i; $j > 0 && $temp < $array[$j - 1]; $j--) {
            $array[$j] = $array[$j - 1];
        }
        $array[$j] = $temp;
    }
    return $array;
}
  • 复杂度分析:
    • 时间复杂度:O(n^2)。
    • 空间复杂度:O(1)。
二、选择排序
  • 算法思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。(不稳定排序)
  • 排序过程:(默认升序)
    • 原始数据:5,2,1,3,7,4
    • 第一次排序:1,2,5,3,7,4
    • 第二次排序:1,2,5,3,7,4
    • 第三次排序:1,2,3,5,7,4
    • 第四次排序:1,2,3,4,7,5
    • 第五次排序:1,2,3,4,5,7
  • 算法代码:
<?php

$array = array(5, 2, 1, 3, 7, 4);
print_r(selectSort($array));

function selectSort($array)
{
    $n = count($array);
    for ($i = 0; $i < $n - 1; $i++) {
        $min = $i;
        for ($j = $i + 1; $j < $n; $j++) {
            if ($array[$j] < $array[$min]) {
                $min = $j;
            }
        }
        if ($array[$i] != $array[$min]) {
            list(array[$i], $array[$min]) = array($array[$min], array[$i]);
        }
    }
    return $array;
}
  • 复杂度分析:
    • 时间复杂度:O(n^2)。
    • 空间复杂度:O(1)。
三、冒泡排序
  • 算法思想:每一次遍历都找出一个最大的数字放在最后.具体实现就是从最开始进行两两比较,若两者构成逆序,则进行位置调换。(稳定排序)
  • 排序过程:(默认升序)
    • 原始数据:5,2,1,3,7,4
    • 第一次排序:2,1,3,5,4,7
    • 第二次排序:1,2,3,4,5,7
    • 第三次排序:1,2,3,4,5,7
    • 第四次排序:1,2,3,4,5,7
    • 第五次排序:1,2,3,4,5,7
  • 算法代码:
<?php

$array = array(5, 2, 1, 3, 7, 4);
print_r(bubbleSort($array));

function bubbleSort($array) {
    $n = count($array);
    for ($i = 0; $i < $n -1; $i++) {
        for ($j = 0; $j < $n - 1 - $i; $j++) {
            if ($array[$j] > $array[$j+1]) {
                $array[$j] = $array[$j] ^ $array[$j+1];
                $array[$j+1] = $array[$j] ^ $array[$j+1];
                $array[$j] = $array[$j] ^ $array[$j+1];
            }
        }
    }
    return $array;
}
  • 复杂度分析:
    • 时间复杂度:O(n^2)。
    • 空间复杂度:O(1)。
四、快速排序
  • 算法思想:取第一个或最后一个称为基准,也可以随机取,然后就是比基准小的在左边,比基准大的放到右边,基准插入到中间,然后再按照同样的方法把左右两连进行递归快速排序,直到不能分解为止。(不稳定排序)
  • 排序过程:(默认升序)
    • 原始数据:5,2,1,3,7,4
    • 第一次分治:{4,2,1,3},{5},{7}
    • 第一次递归:{3,2,1},{4},{5},{7}
    • 第二次递归:{1,2},{3},{4},{5},{7}
    • 第三次递归:{1,2,3,4,5,7}
  • 算法代码:
<?php

$array = array(5, 2, 1, 3, 7, 4);
quickSort($array, 0, count($array) - 1);
print_r($array);

function quickSort(&$arr, $l, $r)
{
    if ($l >= $r) return;
    $v = $arr[$l];
    $j = $l;
    for ($i = $l + 1; $i <= $r; $i++) {
        if ($arr[$i] < $v) {
            $j++;
            list($arr[$j], $arr[$i]) = array($arr[$i], $arr[$j]);
        }
    }
    list($arr[$l], $arr[$j]) = array($arr[$j], $arr[$l]);
    quickSort($arr, $l, $j - 1);
    quickSort($arr, $j + 1, $r);
}
  • 复杂度分析:
    • 时间复杂度:O(nlogn)。
    • 空间复杂度:O(1)。

转载于:https://my.oschina.net/CodeLivestock/blog/3099949

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值