php的几种排序算话

冒泡算法

冒泡算话是简单的算话,基于循环不变式,也就是在下一次排序之前,前边的数是已经排序好,而且每次都是用当前数与前边的数一一比较。

循环不变式主要用来证明算法的正确性,即是证明执行步骤的的正确性,

循环不变式特性:

初始化:在循环的第一轮迭代开始之前,应该是正确

保持:如果在循环的某一次迭代开始时正确的,那么在下一次迭代之前他应该是正确的

分治算法:

是把 一个问题分成很多个规模较小和结构与问题类似的子问题,分别处理子问题在把子问题的结果合并成原问题的解。

分治模式在每一层递归上都有是三个模式

分解:把原问题分解成多个子问题

解决:递归解决子问题,如果子问题足够小直接求解

合并:在子问题的解答合并成原问题的解答;

冒泡排序是原地插入排序:

$arrs =
array(8,3,2,5,-4,6,7,1,9,0,-9);
/**
*插入排序
O(N的平方)
*/
for($j =
0;$j < count($arrs); $j++)
{
$v = $arrs[$j];
for($i = $j; $i >=
0 && $arrs[$i-1] > $v;$i--)
{
$arrs[$i] =
$arrs[$i-1];
$arrs[$i-1] = $v;
print_r($arrs);
}
}

$arrs = array(8,3,2,5,-4,6,7,1,9,0,-9);
/**
*插入排序
*/
$arr_len =
count($arrs);
for($i = 0; $i < $arr_len;$i++)
{

for($ii = ($arr_len-2);$ii >= $i;$ii--)
{
$v =
$arrs[$ii];
if($arrs[$ii] > $arrs[$ii + 1])
{
$arrs[$ii] =
$arrs[$ii + 1];
$arrs[$ii+1] = $v;
}
}

}

/**
快速排序 分治方法
即是把数组分割为小数组,直到 数组等于二,或是1
此方法 计算最大时时间
2T(n/2)+N
*/

function maxsubsum($left=0,$right=0)
{
static $arr =
array(8,3,2,5,-4,6,7,1,9,0,-9); //11
if($left==$right) return;
$center
= intval(($left + $right)/2);
$maxleftsum =
maxsubsum($left,$center);
$maxrightsum =
maxsubsum($center+1,$right);
for($j=$left;$j<=$right;$j++)
{
$v
= $arr[$j];
for($i = $j; $i >= 0 && $arr[$i-1] >
$v;$i--)
{
$arr[$i] = $arr[$i-1];
$arr[$i-1] =
$v;
}
print_r($arr);
}

}

//maxsubsum(0,10);

/**
*排序原理,基本原离基于插入排序交换了数组的值,让当值与它的前边的值一一比较,如果前边的值比其,则一一交换位置,当前值往前以以为,所以虽然每次都是两两比较,都是

8,3,5,9,2
其原理
获得当前元素的值,与其前面的元素值一一比较如果,如果前面的值大于这个元素则交换他们两个的位置,以为比较当前值时前边的远已经排序
如第一次
83592
第二次
$this = 5 = $arr(1); 此时比较 8和3,8>3因此交换
38592
比较第三次 $this = 5 =
$arr(2);
先比较 8和5,8>5
因此交换 35892,也就是此时5已经往前已过一位。在比较 3和5其实就是在比较
$arr[0],$arr[1]
第四次比较 $this = 9 = $arr(3); 此时比较 8和9,8>9因此不交换
35892
第五次 $this = 2 = $arr(4); 此时比较 9和2 相当于比较35829

*
*/

快速排序是基于插入排序,对插入排序的一种优化,插入排序的一个很重要的有点就是接生空间,因其是原地排序不占用多余的内存。

快速排序是以后总分治的递归的插入排序。

快速排序的步骤:

分组(分解):选取一个枢纽 R 是使得数组 A(i,j-1) 的小于 R A(j+1,n) 大于 R A[j] = R
因R已经排序所以不并入排序的数组中;

解决:递归的解决 A(i,j-1),A(j+1,n) 直到剩余两个数组元素就可以确定这两个数组元素的顺序一次的解决所有的元素的顺序

合并:因为子数组是原地排序,我们操作的只是数组的下标和值,因此当子数组排序完成的时候,排序也就排序好了

$arr =
array(0=>2,1=>8,2=>7,3=>1,4=>3,5=>5,6=>6,7=>4,8=>10,9=>9,10=>13);

function kuaisu(&$arr,$left,$right)

{

  if($left < $right){

 $q = paixu($arr,$left,$right); // 因为返回的 是的$j +1;

kuaisu($arr,$left,$q-2);

kuaisu($arr,$q,$right); 

}

}

function paixu(&$arr,$left,$right)

{

  $key = $arr[$left]; //用于枢纽

  $i = $left +1; //左边

for($j = $right; $j >= $i;$j--)  //先从右边跑

{

  if($arr[$j] < $key)

{

  while($i<=$j) // 从左边跑

{

  if($arr[$i] > $key)

{

  $arr[$i] = $tmp;

  $arr[$i] = $arr[$j]; $arr[$j] = $arr[$i];

break;

}

  $i++

}

}

}

$arr[$left] = $arr[$i-1]; $arr[$i-1] = $key;

return $i;

}

时间: 2024-08-11 03:35:47

php的几种排序算话的相关文章

七种排序算法的实现和总结

最近把七种排序算法集中在一起写了一遍. 注释里有比较详细的说明. 1 /*排序算法大集合**/ 2 #include <stdio.h> 3 #include <string.h> 4 #include <stdlib.h> 5 6 //------------------快速排序------------------// 7 /* 8 核心: 9 如果你知道多少人该站你前面,多少人站你后面,你一定知道你该站哪个位置. 10 算法: 11 1.选取分界数,参考这个分界数,

数组的几种排序算法的实现

转自: http://blog.csdn.net/letthinking/article/details/6764996 . 数组的排序方法有很多,效率也各不相同,下面简单介绍一下几种常见的排序算法. 1.选择排序法:将要排序的数组分成两部分,一部分是从大到小已经排好序的,一部分是无序的,从无序的部分取出最小的放到已经排序的最后面.实现如下: [java] view plaincopy public int[] choiceSort(int[] arr){ for(int i = 0;i < a

Python - 几种排序算法的实现

直接插入.选择排序.冒泡排序.快速排序.……归并排序.基数排序.希尔.堆排序. 直接插入: 思想是:1.将数据序列分成两部分,前一部分是有序的,后面一部分是无序的. 2.将无序变有序,首先从第一开始,然后第一,第二比较后排序,此时这两位就是有序的了:然后从无序的队列中取出第三位和第二位比较,然后他们中矮的再和第一位比较,此时三位是有序的: 然后再取出第四位,和前面的比较……,一直到最后一位比较. def insert_sort(aList): n = len(aList) for i in ra

模板化的七种排序算法,适用于T* vector&lt;T&gt;以及list&lt;T&gt;

最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板纯属于偷懒,更方便于测试代码的有效性,等代码写完也懒得去改了.下面开始介绍这段代码,有什么不对的地方欢迎前来指正. 一共写了七种排序,插入排序InsertSort.堆排序HeapSort.快速排序QuickSort.合并排序MergeSort,计数排序CountingSort,基数排序RadixSo

探讨排序算法的实现

排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等.本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法.本文主要讨论算法的实现方法,并不会过多介绍基本理论. 评价一个排序算法优劣适用与否,一般需要从三个方面来分析 时间复杂度.用比较操作和移动操作数的最高次项表示,由于在实际应用中最在乎的是运行时间的上限,所以一般取输入最坏情况的下的运行时间作为

软考笔记第六天之各排序算法的实现

对于前面的排序算法,用c#来实现 直接插入排序: 每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序.第一趟比较前两个数,然后把第二个数按大小插入到有序表中: 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中:依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程.直接插入排序属于稳定的排序,最坏时间复杂性为O(n^2),空间复杂度为O(1).直接插入排序是由两层嵌套循环组成的.外层循环标识并决定待比较的数值.内层循环为待比较数值确定其最终位

Python学习(三) 八大排序算法的实现(下)

本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过一趟排序将要排序的数据切割成独立的两部分,当中一部分的全部数据都比另外一部分的全部数据都要小,然后再按此方法对这两部分数据分别进行高速排序,整个排序过程能够递归进行,以此达到整个数据变成有序序列. 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全

12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

出处:http://blog.csdn.net/han_xiaoyang/article/details/12163251. 声明:版权所有,转载请注明出处,谢谢. 0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比较笨的刷题学的,囧),不过又想了想,算法这东西,博主自己学的过程中一直深感,基础还是非常重要的,很多难题是基础类数据结构和题目的思想综

八种排序算法效率比较

从刚上大一那会儿学的C语言开始,就已经接触到了不少排序算法,但当时都只是为了完成简单的排序任务而已,而且所给的数据也不够多,所以看不出各个排序算法间的执行效率的优劣.最近有个数据结构课程设计的实验,是有关于排序算法之间的效率比较,我就顺便把它放上来了,并对各个算法执行的效率时间做了柱形统计图表.此次实验主要测试了8种排序算法:插入排序.快速排序.冒泡排序.希尔排序.简单选择排序.堆排序.归并排序.折半插入排序. 总共建立了三种情况,分别是平均排序.最好情况排序.最坏情况排序.第一种情况就是使用了