php语言实现的7种基本的排序方法
今天总结了一下常用的7种排序方法,并用php语言实现。
直接插入排序
/*
* 直接插入排序,插入排序的思想是:当前插入位置之前的元素有序,
* 若插入当前位置的元素比有序元素最后一个元素大,则什么也不做,
* 否则在有序序列中找到插入的位置,并插入
*/
function insertSort($arr) {
$len = count($arr);
for($i = 1; $i < $len; $i++) {
if($arr[$i-1] > $arr[i]) {
for($j = $i - 1;$j >= 0; $j-- ) {
$tmp = $arr[$j+1];
if($tmp < $arr[$j]) {
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}else{
break;
}
}
}
}
return $arr;
}冒泡排序
/*
冒泡排序,冒泡排序思想:进行 n-1 趟冒泡排序, 每趟两两比较调整最大值到数组(子数组)末尾
*/
function bubbleSort($arr) {
$len = count($arr);
for($i = 1; $i < $len; $i++) {
for($j = 0; $j < $len-$i; $j++) {
if($arr[$j] > $arr[$j+1]) {
$tmp = $arr[$j+1];
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
return $arr;
}简单选择排序
/*
简单选择排序, 简单排序思想:从数组第一个元素开始依次确定从小到大的元素
*/
function selectSort($arr) {
$len = count($arr);
for($i = 0; $i < $len; $i++) {
$k = $i;
for($j = $i+1; $j < $len; $j++) {
if($arr[$k] > $arr[$j]) {
$k = $j;
}
}
if($k != $i) {
$tmp = $arr[$i];
$arr[$i] = $arr[$k];
$arr[$k] = $tmp;
}
}
return $arr;
}希尔排序
/*
希尔排序,希尔排序原理:将数组按指定步长分隔成若干子序列,然后分别对子序列进行排序(在这是直接)
*/
function shellSort($arr) {
$len = count($arr);
$k = floor($len/2);
while($k > 0) {
for($i = 0; $i < $k; $i++) {
for($j = $i; $j < $len, ($j + $k) < $len; $j = $j + $k) {
if($arr[$j] > $arr[$j+$k]) {
$tmp = $arr[$j+$k];
$arr[$j+$k] = $arr[$j];
$arr[$j] = $tmp;
}
}
}
$k = floor($k/2);
}
return $arr;
}快速排序
/*
* 快速排序,快排思想:通过一趟排序将待排的记录分为两个独立的部分,其中一部分的记录的关键字均不大于
* 另一部分记录的关键字,然后再分别对这两部分记录继续进行快速排序,以达到整个序列有序,具体做法需要
* 每趟排序设置一个标准关键字和分别指向头一个记录的关键字和最后一个记录的关键字的指针。
* quickSort($arr, 0, count($arr) -1);
*/
function quickSort(&$arr,$low,$high) {
if($low < $high) {
$i = $low;
$j = $high;
$primary = $arr[$low];
while($i < $j) {
while($i < $j && $arr[$j] >= $primary) {
$j--;
}
if($i < $j) {
$arr[$i++] = $arr[$j];
}
while($i < $j && $arr[$i] <= $primary) {
$i++;
}
if($i < $j) {
$arr[$j--] = $arr[$i];
}
}
$arr[$i] = $primary;
quickSort($arr, $low, $i-1);
quickSort($arr, $i+1, $high);
}
}堆排序
/*
堆排序
*/ // 调整子堆的为大根堆的过程,$s为子堆的根的位置,$m为堆最后一个元素位置
function heapAdjust(&$arr, $s, $m) {
$tmp = $arr[$s];
// 在调整为大根堆的过程中可能会影响左子堆或右子堆
// for循环的作用是要保证子堆也是大根堆
for($j = 2*$s + 1; $j <= $m; $j = 2*$j + 1) {
// 找到根节点的左右孩子中的最大者,然后用这个最大者与根节点比较,
// 若大则进行调整,否则符合大根堆的 特点跳出循环
if($j < $m && $arr[$j] < $arr[$j+1]) {
$j++;
}
if($tmp >= $arr[$j] ) {
break;
}
$arr[$s] = $arr[$j];
$s = $j;
}
$arr[$s] = $tmp;
} // 堆排序
function heapSort($arr) {
$len = count($arr);
// 依次从子堆开始调整堆为大根堆
for($i = floor($len/2-1); $i >= 0; $i--) {
heapAdjust($arr, $i, $len-1);
}
// 依次把根节点调换至最后一个位置,再次调整堆为大根堆,找到次最大值,
// 依次类推得到一个有序数组
for($n = $len-1; $n > 0; $n--) {
$tmp = $arr[$n];
$arr[$n] = $arr[0];
$arr[0] = $tmp;
heapAdjust($arr, 0, $n-1);
}
return $arr;
}归并排序
/*
归并排序,这里实现的是两路归并
*/
// 分别将有序的$arr1[s..m]、$arr2[m+1..n]归并为有序的$arr2[s..n]
function Merge(&$arr1, &$arr2, $s, $m, $n) {
for($k = $s,$i = $s, $j = $m+1; $i <= $m && $j <= $n; $k++) {
if($arr1[$i]<$arr1[$j]) {
$arr2[$k] = $arr1[$i++];
}else {
$arr2[$k] = $arr1[$j++];
}
}
if($i <= $m) {
for(; $i <= $m; $i++) {
$arr2[$k++] = $arr1[$i];
}
} else if($j <= $n) {
for(; $j <= $n; $j++) {
$arr2[$k++] = $arr1[$j];
}
}
} // 递归形式的两路归并
function MSort(&$arr1, &$arr2, $s, $t) {
if($s == $t) {
$arr2[$s] = $arr1[$s];
}else {
$m = floor(($s+$t)/2);
$tmp_arr = array();
MSort($arr1, $tmp_arr, $s, $m);
MSort($arr1, $tmp_arr, $m+1, $t);
Merge($tmp_arr, $arr2, $s, $m, $t);
}
} // 对一位数组$arr[0..n-1]中的元素进行两路归并
function mergeSort($arr) {
$len = count($arr);
MSort($arr, $arr, 0, $len-1);
return $arr;
}使用经验
- 若排序的记录数目n较小时,可以采用直接插入排序和简单选择排序,当记录本身信息量较大时,用简单选择排序方法较好。
- 若待排序记录按关键字基本有序,适合采用直接插入排序和冒泡排序。
- 若n值较大时,可以采用快速排序、堆排序和归并排序。另外快速排序被认为是内部排序方法中最好的方法。
php语言实现的7种基本的排序方法的更多相关文章
- Java中8种常见的排序方法
排序方法的演示1)插入排序(直接插入排序.希尔排序)2)交换排序(冒泡排序.快速排序)3)选择排序(直接选择排序.堆排序)4)归并排序5)分配排序(基数排序)所需辅助空间最多:归并排序所需辅助空间最少 ...
- Java几种常见的排序方法
日常操作中常见的排序方法有:冒泡排序.快速排序.选择排序.插入排序.希尔排序,甚至还有基数排序.鸡尾酒排序.桶排序.鸽巢排序.归并排序等. 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一 ...
- 几种常见的排序方法总结(Python)
几种常见的排序算法总结(Python) 排序算法:是一种能将一串数据依照特定顺序进行排序的一种算法. 稳定性:稳定排序算法会让原本有相等键值的记录维持相对次序.也就是如果一个排序算法是稳定的,当有两个 ...
- 几种常见的排序方法(C语言实现)
#include <stdio.h> #include <stdlib.h> #include <Windows.h> //直接插入排序 void InsertSo ...
- C# 几种常见的排序方法
1.冒泡排序 //冒泡排序 public void BubbleSort(int[] list) { int i, j, temp; bool done = false; j = ; while (( ...
- C#编写的 8种初级+高级排序方法(转)
摘自:http://blog.csdn.net/mevin/article/details/6714520 程序代码: view plaincopy to clipboard using System ...
- 比较两种数组随机排序方法的效率 JavaScript版
//比较2中数组随机排序方法的效率 JavaScript版 //randon1思路 //当len=5时候,从0-5中随机3一个放入i=0, // 从0-3随机一个2放入i=2 // 从0-2随机一个1 ...
- ch1_6_1求解两种排序方法问题
考拉有n个字符串字符串,任意两个字符串长度都是不同的. 考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序.例如: "car" < "carr ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...
随机推荐
- 关于printf错用格式化字符串导致double和long double输出错误的小随笔
[题外话] 以前用HUSTOJ给学校搭建Online Judge,所有的评测都是在Linux下进行的.后来为了好往学校服务器上部署,所以大家重新做了一套Online Judge,Web和Judge都是 ...
- SQL Server 事务隔离级别详解
标签: SQL SEERVER/MSSQL SERVER/SQL/事务隔离级别选项/设置数据库事务级别 SQL 事务隔离级别 概述 隔离级别用于决定如果控制并发用户如何读写数据的操作,同时对性能也有一 ...
- 在Windows中安装Memcached
Memcached是一个高并发的内存键值对缓存系统,它的主要作用是将数据库查询结果,内容,以及其它一些耗时的计算结果缓存到系统内存中,从而加速Web应用程序的响应速度. Memcached最开始是作为 ...
- TODO:Ubuntu下安装Node
TODO:Ubuntu下安装Node Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高 ...
- MyEclipse打开 HTML 报错Failed to create the part's controls
拷贝代码时有时会弹出这个错误,页面仍然可以访问,但是无法编辑很郁闷. MyEclipse默认打开编辑页面是MyEclipse visual html designer 右击html页面选择open ...
- 微信小程序客服消息使用指南
客服消息使用指南 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. 功能介绍 用户可使用小程序客服消息功能,与小程序的客服人 ...
- 自用迷你版的Deferred
啥也不说贴代码,项目用 /** * 迷你版的deferred */ function Deferred(func) { if (this instanceof Deferred === false) ...
- MySql联接算法
联接算法是MySql数据库用于处理联接的物理策略.在MySql 5.5版本仅支持Nested-Loops Join算法,如果联接表上有索引时,Nested-Loops Join是非常高效的算法.如果有 ...
- 梯度下降(Gradient Descent)小结
在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法.这里就对梯度下降法做一个完整的总结. 1. 梯度 在微 ...
- RHEL 6.3 详细安装教程
以前刚接触linux时,什么都不懂,为了学习,在电脑上安装双系统(原系统为Win7),吃过不少苦头,在网上搜教程,很多都是语焉不详,导致安装过程中战战兢兢.最近朋友面试运维,面试官有考他对linux安 ...