冒泡排序

  • 两两比较相邻记录的关键字,如果反序则交换,大的数字往下沉,一直到最大的出现在数组最后

function swap(&$x, &$y) {
$temp = $x;
$x = $y;
$y = $temp;
}
function bubble_sort(&$arr) {//php的陣列視為基本型別,所以必須用傳參考才能修改原陣列
for ($i = 0; $i < count($arr) - 1; $i++) { //控制循环的次数
for ($j = 0; $j < count($arr) - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
swap($arr[$j], $arr[$j + 1]);
}
}
}
}

改进的冒泡排序

  • 第一层循环不变,第二层循环冒泡变成从后往前,这样做可以在冒泡的过程中尽可能的将小的数据向前冒。
function bubble_sort(&$arr)
{
for ($i=0;$i<count($arr);$i++) {
for ($j=count($arr)-1;$j>$i;$j--) {
if ($arr[$j-1]>$arr[j]) {
swap($arr[j-1],$arr[j]);
}
}
}
}

插入排序

  • 将一个记录插入到已经排好序的有序表中
function insertion_sort(&$arr)
{//php的陣列視為基本型別,所以必須用傳參考才能修改原陣列
for ($i = 1; $i < count($arr); $i++) {
$temp = $arr[$i];
for ($j = $i - 1; $j >= 0 && $arr[$j] > $temp; $j--) {
$arr[$j + 1] = $arr[$j];
}
$arr[$j + 1] = $temp;
}
}

选择排序

  • 通过n-i次关键字的比较,找出n-i+1个记录中最小的记录,并和第i个记录交换
function select_sort(&$arr)
{
for ($i = 0;$i < count($arr);$i++) {
$min = $i;
for ($j = count($arr)-1;$j > $i;$j--) {
if ($arr[$j] < $arr[$min]) {
$min = $j;
}
}
if ($min != $i) {
swap($arr[$i],$arr[$min]);
}
}
}

为什么插入排序比冒泡排序好

  • 两个算法的时间复杂度都是O(n^2),但是冒泡排序每次交换记录时都要进行三次赋值操作,而插入排序因为有哨兵变量,所以只有一步赋值操作,减少了排序时间。

总结

  • 比较排序算法都是空间复杂度为O(1)的原地排序算法,其中冒泡排序和插入排序两两比较不会交换相等的记录,所以这两种排序都是稳定排序,而选择排序只是记录最小值最后进行交换,所以会破坏相对顺序,选择排序不是稳定算法。

原文地址:https://segmentfault.com/a/1190000016768646

比较排序算法(PHP)的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

  10. 排序算法总结------选择排序 ---javascript描述

    每当面试时避不可少谈论的话题是排序算法,上次面试时被问到写排序算法,然后脑袋一懵不会写,狠狠的被面试官鄙视了一番,问我是不是第一次参加面试,怎么可以连排序算法都不会呢?不过当时确实是第一次去面试,以此 ...

随机推荐

  1. vue2 在methods 中无法获取this对象

    在methods中使用箭头函数无法获取this ExamName:()=> { console.log(this);} 这样就行了: ExamName:function() { console. ...

  2. 进入docker 容器内命令

    docker exec :在运行的容器中执行命令 语法 docker exec [OPTIONS] CONTAINER COMMAND [ARG...] OPTIONS说明: -d :分离模式: 在后 ...

  3. java.util.UnknownFormatConversionException: Conversion = ''';

    今天在测试一个新的项目,在执行sql查询报表的时候.由于我的sql中带有%,导致在输出日志时报错“java.util.UnknownFormatConversionException: Convers ...

  4. 使用Modernizr检测支持CSS3

    使用Modernizr检测支持CSS3 如果支持某个属性,会增加一个class,名字就是该属性: 不支持,名字是no-某属性 还提供了一个全局Modernizr对象,使用如下: <script ...

  5. string 简单实现

    namespace ss{ class string { friend ostream& operator <<(ostream&, const string&); ...

  6. 箭头函数普通函数this

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. C#各个版本中的新增特性详解【转】

    序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...

  8. xBIM 基础06 将STEP物理文件转换为XML

    系列目录    [已更新最新开发文章,点击查看详细]  一.STEP标准简介 STEP,它是Standard for the Exchange of Product model data的缩写.产品数 ...

  9. JavaScript原型链:prototype与__proto__

    title: 'JavaScript原型链:prototype与__proto__' toc: false date: 2018-09-04 11:16:54 主要看了这一篇,讲解的很清晰,最主要的一 ...

  10. sicily 1002 Anti-prime Sequences

    debug了好久..各种犯错..按照某个学长的思路,终于AC了.. #include <iostream> #include <cstring> using namespace ...