PHP四大经典排序算法源码

--仅供参考 欢迎点评

<?php
header("Content-Type:text/html; charset=utf-8");

// ****************************************************************
//快速排序:每次取一个比较值$key(即相应数组的$arr[0]),然后依次比较数组中的数,比比较值大的放右边并重命名为$right[],比比较值小的放左边并重命名为$left[]。再递归调用函数最后将$left[],$key,$right[]合并输出。
function quickSort($arr){
$n = count($arr);
if ($n<1) {return $arr;}
//给比较值赋值
$key = $arr[0];
//声明数组左、右数组
$left = array();
$right = array();
//数组中其他的数与比较值比较并赋给$left[]或$right[].
for($i = 1;$i < $n;$i++){
if($arr[$i] <= $key){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
//递归调用quickSort()函数排序每个子数组.
$left = quickSort($left);
$right = quickSort($right);
//最后将$left[],$key,$right[]合并输出。
return array_merge($left,array($key),$right);
}

// ****************************************************************
//冒泡排序:每次比较和交换相邻的两个数直到比较末尾,即每次比较后将当前最大的数冒泡到了最后。一共冒泡n-1次。
function bubbleSort($arr){
$n=count($arr);
if ($n<1) {return $arr;}
//冒泡趟数外循环n-1次。
for($i=0;$i<$n-1;$i++){
//每趟循环中比较和交换次数的内循环(n-(i+1))次。
for($j=$i+1;$j<$n;$j++){
//判断并将大的数交换到后面
if($arr[$i]>$arr[$j]){
$temp = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $temp;
}
}
}
return $arr;
}

// ****************************************************************
//选择排序:在数组中,将最小的数通过比较放在第一个位置,然后将剩下的数最小的放在第二个位置,知道将最大的放在最后。
function selectSort($arr){
$n = count($arr);
if ($n<1) {return $arr;}
//外层循环 先假设第一个数是最小的 并将位置赋给$m
for($i=0;$i<$n;$i++){
$m=$i;
//内循环 找出余下最小值并将位置也赋给$m
for($j=$i+1;$j<$n;$j++){
if($arr[$j]<$arr[$m]){ //$arr[$m]是动态变化的,这里不能写成了$[$i]!
$m=$j;
}
}
//比较找出的最小值是不是与该层第一个数不相等,不相等就交换,否则第一个就是最小的。
if($arr[$m]!=$arr[$i]){
$temp=$arr[$m];
$arr[$m]=$arr[$i];
$arr[$i]=$temp;
}
}
return $arr;
}

// ****************************************************************
//插入排序:
function insertSort($arr) {
$n = count($arr);
if ($n<1) {return $arr;}
for($i=1;$i<$n; $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;
}
}
}
return $arr;
}

//数组定义、赋值
$arr0 = array(23,43,45,434,-7687,990,5,111,23);
echo "原数组是:23 43 45 434 -7687 990 5 111 23<br/>";

//1.调用快速排序
$arr1 = quickSort($arr0);
echo "快速排序的结果是:";
foreach ($arr1 as $value){
echo $value."&nbsp;";
}
echo "<br/>";

//2.调用冒泡排序
$arr2 = bubbleSort($arr0);
echo "冒泡排序的结果是:";
foreach ($arr2 as $value){
echo $value."&nbsp;";
}
echo "<br/>";

//3.调用选择排序
$arr3=selectSort($arr0);
echo "选择排序的结果是:";
foreach ($arr3 as $value) {
echo $value."&nbsp;";
}
echo "<br/>";

//4.调用插入排序
$arr4=insertSort($arr0);
echo "插入排序的结果是:";
foreach ($arr4 as $value) {
echo $value."&nbsp;";
}
echo "<br/>";
?>

时间: 2024-11-10 08:14:59

PHP四大经典排序算法源码的相关文章

C语言的经典排序算法源码

1.插入排序:插入法是一种比较直观的排序方法.它首先把数组头两个元素排好序,再依次把后面的元素插入适当的位置.把数组元素插完也就完成了排序.代码如下: #include<stdio.h> void main() { int a[10]; int i,j,k; printf("请输入10个数字!空格隔开\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); for(i=1;i<10;i++) { k=a[i

八大排序算法源码 + 耗时长度比较(看到好东西转下)

八大排序算法的排序时间长度的比较,测试数据10000000时部分结果如下 输入测试数据长度: 10000000数据初始化中...数据初始化完成!        堆排序用时:    8秒 499毫秒      快速排序用时:   22秒  35毫秒      归并排序用时:   34秒 473毫秒 另外五种排序本人并未等待结果,读者可自行测试 测试时请注意内存消耗,以免数据太大,内存不够,可自行测试单一算法以便增加可测试数据数目 #include <iostream> #include <

js实现四大经典排序算法

为了方便测试,这里写了一个创建长度为n的随机数组 function createArr(n) { var arr = []; while (n--) { arr.push(~~(Math.random() * 100)); } return arr; } 冒泡排序:在要排序的一组数中,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒. 即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换. 若排序要求为从小到大,每一次外层循环把最大的数沉在最后一位,内层循

经典排序算法总结与实现 ---python

原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序.希望能帮助到有需要的同学.之所以用Python实现,主要是因为它更接近伪代码,能用更少的代码实现算法,更利于理解. 本篇博客所有排序实现均默认从小到大. 一.冒泡排序 BubbleSort 介绍

Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

2017年4月29日~5月1日,国际劳动节, 三天的小长假. 在国内,小长假往往是这样的: 然而我当时在戏称为"德村"(德国农村)的Walldorf出差并且住在Wiesloch, 这里的五一小长假能听见鸟叫,虫鸣,和风吹过的声音,除此之外再无其他. 街道上别说行人了,连行驶的汽车都很少. 如果一个在成都习惯了热闹生活的人,到了这种乡下地方来估计会觉得百无聊赖.当时国内有同事建议我小长假去德国其他地方转转,然而作为一个30年资深宅男,一个人出去转不是我的风格. 五一放假之前,坐我对面的一

java实现经典排序算法

前言 博主最近在恶补基础知识,算法必然是必不可少的,那么就从经典排序算法开始吧!(图源网络,侵删),没有列出全部,因为在期末考试囧 代码太多,就只显示了最关键的部分 1. 冒泡排序 实现思路: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换. (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第 N-1个位置. (3)N=N-1,如果N不为 0就重复前面二步,否则排序完成. 这也是博主接触到的第一个排序算法 public

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第

经典排序算法

经典排序算法(via  kkun) 经典排序算法,以下文章参考了大量网上的资料,大部分都给出了出处 这一系列重点在理解,所以例子什么的都是最简单的情况,难免失误之处,多指教 大多数排序算法都给出了每一步的状态,以方便初学者更容易理解,通俗易懂,部分难以理解的排序算法则给出了大量的图示,也算是一个特色吧 经典排序算法 - 快速排序Quick sort 经典排序算法 - 桶排序Bucket sort 经典排序算法 -  插入排序Insertion sort 经典排序算法 - 基数排序Radix so

C#实现所有经典排序算法

C# 实现所有经典排序算法 1 .选择排序 选择排序 原理: 选择排序是从冒泡排序演化而来的,每一轮比较得出最小的那个值,然后依次和每轮比较的第一个值进行交换. 目的:按从小到大排序. 方法:假设存在数组:72, 54, 59, 30, 31, 78, 2, 77, 82, 72 第一轮依次比较相邻两个元素,将最小的一个元素的索引和值记录下来,然后和第一个元素进行交换. 如上面的数组中,首先比较的是72,54,记录比较小的索引是54的索引1.接着比较54和59,比较小的索引还是1.直到最后得到最