php数组快速排序
来源:互联网 发布:android精美ui源码 编辑:程序博客网 时间:2024/04/30 02:15
如果要做到可以随手写出快速排序算法,那首先你就必须了解快速排序的机制到底是什么样子的。
我们就先从快排的原理入手。
假如我们有一个待排序数组:
$array=array(5,7,4,2,11,10,6);
快排的原理是这个样子的,首先我们清楚快排肯定要用到递归的方法来完成排序,那么,每一次递归都做了什么工作呢?其实每一次递归的工作非常简单;
1。首先,选出来数组的第一个元素,作为对比值,$array中的就是5
2.然后,从数组第二个值开始,从前往后找到第一个比5大的数字,这是一个for循环,终止条件就是找到第一个比5大的数字,或者到达数组的末尾。这里我们知道的就是7
3.接下来,再用一个for循环,从后往前找,找到第一个比5小的值,或者到达数组的末尾。这里我们得到了2
这个时候我们对比从前向后找第一次for循环停下来的值对应的键,应该是array[1],也就是i=1;第二次从后向前找的时候,获得的是array[3],也就是j=3;
4.接下里的处理会稍微复杂点,就是,这个时候,我们需要判断,i与j的大小,当i>j的时候,这个时候就等于是完成这两次循环所要做的。但是当i<j的时候,我们需要把i和j对应的值交换,然后继续刚才的两个循环,直到满足这个循环退出条件并且i>j。
5.如果当两个for循环都找到了符合条件的值,并且i>j的时候,我们把j对应的值和第一个我们选作对比值的那个值交换,这个时候,我们就完成了递归中一次。这个时候$array=(4,2,5,7,11,10,6)
6.然后剩下的值分成两个部分,在交换后对比值所在位置前面的,都是比这个对比值小的,他们成为一个数组,递归下去。在交换后对比值所在位置后面的,分成一个数组,递归下去。
以上就是一次递归所做的东西,我们也叫做快排的一次划分。
其实快速排序之所以称之快速,就是因为,冒泡排序是每次对比只交换相邻的两个值的位置,这样每个值要移动到它最终的排序结果中所对应的位置,可能需要很多次位置的变化。但是快速排序可在一次划分中,就确定你选定的那个对比值在最终排序好的队列中的位置。这就是快排的特点。
下面贴出来两组用php实现的快速排序:
第一种大家都比较常见到,网上有很多,做的也很巧妙:
<span style="font-size:18px;">function quick_sort(array $array){ $length=count($array); $left_array=array(); $right_array=array(); if($length<=1){ return $array; } $key=$array[0]; //注意这里的i一定要等于1,也就是从数组的第二个值开始比较,因为第一个值已经是被选定为对比值了 for($i=1;$i<$length;$i++){ if($array[$i]>$key){ $right_array[]=$array[$i]; }else{ $left_array[]=$array[$i]; } } $left_array=quick_sort($left_array); $right_array=quick_sort($right_array); returnarray_merge($left_array,array($key),$right_array); }</span>
第二种方法:
这种方法虽然是根据最直观的快速排序定义来完成的,但是如果你是用php去实现快速排序,还是建议使用第一种方法。第一种方法从编写和掌握上都有一定的复杂性在里面。
<span style="font-size:18px;">function quick_sort(array $sort,$start,$end){ $i; $j; $temp; if($start<$end){ $i=$start; $j=$end+1; while(1){ do{ $i++; }while(!($sort[$start]<=$sort[$i] ||$i==$end)); do{ $j--; }while(!($sort[$j]<=$sort[$start] || $j==$start)); if($i<$j){ $temp=$sort[$i]; $sort[$i]=$sort[$j]; $sort[$j]=$temp; }else{ break; } } $temp=$sort[$start]; $sort[$start]=$sort[$j]; $sort[$j]=$temp; quick_sort($sort,$start,$j-1); quick_sort($sort,$j+1,$end); } return $sort;}</span>
0 0
- php数组快速排序
- php关联数组排序(快速排序)
- php 二维数组快速排序算法
- 数组排序-快速排序
- PHP快速排序法(数组排序)与简单选择排序
- 二维数组快速排序
- 数组实现快速排序
- JAVA数组快速排序
- iOS数组快速排序
- 数组快速排序,selecter
- int数组快速排序
- 数组和快速排序
- 快速排序:数组
- 快速排序 数组 单链表
- 数组快速排序
- 数组&链表 快速排序
- 数组快速排序
- 二维数组快速排序
- PPP、TCP/IP、UDP协议之间的关系
- NodeJs 常用工具
- iOS版本更新的App提交审核发布流程---这篇博客有点老,不过也可以借鉴。
- HTTP协议详解(真的很经典)
- 正则表达式的两数字之间的数
- php数组快速排序
- 配置跨数据库的事务控制
- 2023
- matlab写入和读取文件数据
- The query does not start with a valid identifier, has to be either SELECT, UPDATE or DELETE FROM
- 经典算法——堆排序笔试题
- 使用UIWebView 有些网页加载卡顿 内存还飙升的可别厉害
- mybatis批量插入oracle解决方法
- Ajax 与后台 HttpServlet 的简单交互