几个简单易懂的排序算法php
几个简单易懂的排序算法。排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。
<?php // 冒泡排序
function bubble_sort(array $arr){
$len = count($arr) - 1;
for($i=0; $i< $len; $i++){
// 升序的话,两两比较第一轮排序过后,最后一个一定是最大的了;
// 所以第二轮时$j依然从0开始,但是结束的时候只需要管前$len-1的长度
for($j=0; $j < $len-$i; $j++){
if ($arr[$j] > $arr[$j+1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
} // 选择排序
function select_sort(array $arr){
$len = count($arr) - 1;
for($i=0; $i< $len; $i++){
for($j=$i+1; $j <= $len; $j++){
// 选择排序,就是选择下边是$i的元素,固定住它,让它去和$j的比和交换
if ($arr[$j] < $arr[$i]){
$temp = $arr[$j];
$arr[$j] = $arr[$i];
$arr[$i] = $temp;
}
}
}
return $arr;
} // 插入排序
/** 所谓插入排序法,就是检查第i个数字,如果在它的左边的数字比它大,进行交换,这个动作一直继续下去,直到这个数字的左边数字比它还要小,就可以停止了。插入排序法主要的回圈有两个变数:i和j,每一次执行这个回圈,就会将第i个数字放到左边恰当的位置去。**/
function insert_sort(array $arr){
$len = count($arr) - 1;
for($i=0; $i<= $len; $i++){
// 在$i位置前面的元素进行插入
for($j=$i; $j >0; $j--){
if ($arr[$j-1] > $arr[$j]){
$temp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $temp;
}
}
}
return $arr;
} $arr = array(12, 9, 1, 4, 6, -3); $bubble = bubble_sort($arr);
$select = select_sort($arr);
$insert = insert_sort($arr); echo '<pre>';
print_r($bubble); echo '<pre>';
print_r($select); echo '<pre>';
print_r($insert); /**
*
Array
(
[0] => -3
[1] => 1
[2] => 4
[3] => 6
[4] => 9
[5] => 12
)
*/
排序算法,在应用到解决实际问题的时候(由于不一定总是数字排序),重点要分析出什么时候该交换位置。
用冒泡法实现了一个简单的排序问题,题目是这样的。

<?php
$arr = array(
'B5','D3','B4','B2','C5','A1','A2','A6','A4','A5','A6','B1','C1'
); $len = count($arr) - 1;
for($i=0; $i< $len; $i++){
for($j=0; $j < $len-$i; $j++){
$first_1 = getstr($arr[$j]);
$first_2 = getstr($arr[$j],1);
$second_1 = getstr($arr[$j+1]);
$second_2 = getstr($arr[$j+1],1);
$con1 = $first_1=='A' &&
( $second_1!='A' || ($second_1=='A' && $first_2<$second_2) );
$con2 = $first_1!='A' && $second_1!='A' &&
($first_2<$second_2 || ($first_2==$second_2 && ord($first_1)<ord($second_1) )); if ($con1 || $con2){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
} // 取字符串 A1中的A或者1
function getstr($str,$type=0){
return substr($str, $type,1);
} print_r($arr);
echo array_shift($arr); /** *
Array
(
[0] => C5
[1] => B5
[2] => B4
[3] => D3
[4] => B2
[5] => C1
[6] => B1
[7] => A6
[8] => A6
[9] => A5
[10] => A4
[11] => A2
[12] => A1
)
*
*
C5
*/
几个简单易懂的排序算法php的更多相关文章
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...
- JavaScript实现常用的排序算法
▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法汇总(C/C++实现)
前言: 本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...
- 用Java来写常见的排序算法
随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...
- 模板化的七种排序算法,适用于T* vector<T>以及list<T>
最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...
随机推荐
- Angular 6.X CLI(Angular.json) 属性详解
Angular CLI(Angular.json) 属性详解 简介 angular cli 是angular commond line interface的缩写,意为angular的命令行接口.在an ...
- js-ES6学习笔记-module(1)
1.在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种.前者用于服务器,后者用于浏览器.ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可 ...
- kafka-hadoop-consumer
写了一个工具,从kafka传输数据到hdfs,采用的api,可以消费指定的kafka topic 或者为了简便可以消费所有的topic中各个partition的数据. 地址:https://githu ...
- Djang之Model操作
Django之Model操作 一.字段 1.字段列表: AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField ...
- [原创]RedHat 安装MySQL数据库
朋友购买了阿里云的服务器,服务器上自带有CentOS操作系统,但是开发软件需要自己安装,接下来将介绍本地RedHat Linux 5.10虚拟机上搭建Mysql数据库. 一.软件准备 (1)jdk-6 ...
- NodeJS中MySql的增删改查操作
纯粹记录一下最基础写法,几乎没有写什么逻辑,写法也并不是很完善(因为我自己也刚刚摸索出来这么写可以...= =!) 望高手指教 也希望能够帮到比我还新的新手.... //1.insert操作 ...
- jetty和tomcat比较
两点,性能极佳,配置简单方便. 主要是设计思想的不同.Tomcat 主要是作为 JSP/Servlet 最新规范的参考实现而设计,属于学院派,但是显得庞大而杂乱.Tomcat 的性能很差,一般是作为 ...
- 可选的binlog解析组件
本文的mysql-binlog-connector-java:https://github.com/shyiko/mysql-binlog-connector-java 阿里的canal:https: ...
- 转:jQuery选择器大全(48个代码片段+21幅图演示)
选择器是jQuery最基础的东西,本文中列举的选择器基本上囊括了所有的jQuery选择器,也许各位通过这篇文章能够加深对jQuery选择器的理解,它们本身用法就非常简单,我更希望的是它能够提升个人编写 ...
- python 多进程和多线程的区别
了解线程和进程 进程 程序:磁盘上的可执行二进制文件,并无运行状态. 进程:就是一个正在运行的任务实例(存活在内存里). 获取当前电脑的CPU核心数: pip install psutil >& ...