简单排序算法

来源:互联网 发布:linux系统安装ftp包 编辑:程序博客网 时间:2024/05/15 08:39
<?php
$arr = array(
    12,
    45,
    89,
    3,
    24,
    55,
    223,
    76,
    22,
    11,
    28,
    112,
    20,
    434,
    23,
    65,
    65,
    765,
    6,
    8,
    23,
    5,
    33,
    553,
    45,
    423,
    64,
    77,
    84,
    23
);

/**
 * 冒泡排序算法,时间复杂度n²/2次
 * 冒泡排 序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
 * 然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最 后。
 * 在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第 二个数
 * (倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。如此下去,重复以上过 程,
 * 直至最终完成排序。
 */
function maopao_sort($arr)
{
    $count = count($arr);
    $tmp;
    $m = 0; // 用于计算执行多少次
    for ($i = 0; $i < $count - 1; $i ++) {
        for ($j = 0; $j < $count - 1 - $i; $j ++) {
            if ($arr[$j] > $arr[$j + 1]) {
                $tmp = $arr[$j];
                $arr[$j] = $arr[$j + 1];
                $arr[$j + 1] = $tmp;
            }
            $m ++;
        }
    }
    print_r($arr);
    echo $m;
}

/**
 * 选择排序算法,时间复杂度n²/2次
 * 1.从待排序序列中,找到关键字最小的元素;
 * 2.如果最小元素不是待排序序列的第一个元素,将其和第一个元素互换;
 * 3.从余下的 N - 1 个元素中,找出关键字最小的元素,重复( 1 )、( 2 )步,直到排序结束
 */
function select_sort($arr)
{
    $count = count($arr);
    $tmp;
    $m = 0; // 用于计算执行多少次
    for ($i = 0; $i < $count - 1; $i ++) {
        $p = $i;
        for ($j = $i + 1; $j < $count; $j ++) {
            if ($arr[$p] > $arr[$j]) {
                $p = $j;
            }
            $m ++;
        }
        if ($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    print_r($arr);
    echo $m;
}

/**
 * 插入排序算法,时间复杂度n²/2次
 * 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕
 */
function insert_sort($arr)
{
    $count = count($arr);
    $tmp;
    $m = 0; // 用于计算执行多少次
    for ($i = 1; $i < $count; $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;
            }
            $m ++;
        }
    }
    print_r($arr);
    echo $m;
}

/**
 * 快速排序算法,时间复杂度n²/2次
 * 该方法的基本思想是:
 * 1.先从数列中取出一个数作为基准数。
 * 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
 * 3.再对左右区间重复第二步,直到各区间只有一个数。
 */
function quick_sort($arr)
{
    $count = count($arr);
    if ($count <= 1) {
        return $arr;
    }
    $tmp = $arr[0];
    $left_array = array();
    $right_array = array();
    
    for ($i = 1; $i < $count; $i ++) {
        if ($arr[$i] <= $tmp) {
            $left_array[] = $arr[$i];
        } else {
            $right_array[] = $arr[$i];
        }
        $m ++;
    }
    
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    return array_merge($left_array, array(
        $tmp
    ), $right_array);
}
// print_r(quick_sort($arr));
// // print_r(quickSort($arr));
function quickpaixu($arr)
{
    $count = count($arr);
    if ($count <= 1) {
        return $arr;
    }
    $key = $arr[0]; // 取一个值,稍后用来比较;
    $left_arr = array();
    $right_arr = array();
    for ($i = 1; $i < $count; $i ++) { // 比$key大的放在右边,小的放在左边;
        if ($arr[$i] <= $key) {
            $left_arr[] = $arr[$i];
        } else {
            $right_arr[] = $arr[$i];
        }
    }
    $left_arr = quickpaixu($left_arr); // 进行递归;
    $right_arr = quickpaixu($right_arr);
    return array_merge($left_arr, array(
        $key
    ), $right_arr); // 将左中右的值合并成一个数组;
} // 以下是测试
  // print_r(quickpaixu($arr));
?>
1 0
原创粉丝点击