php二分法实力,php常见的几种排序以及二分法查找
1.插入排序
思想:
每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止。
示例:
[初始关键字] [49] 38 65 97 76 13 27
49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
时间复杂度:
如果目标是把n个元素的序列升序排列,那么采用插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需(n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有n(n-1)/2次。插入排序的赋值操作是比较操作的次数加上(n-1)次。平均来说插入排序算法的时间复杂度为O(n^2)。因而,插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么插入排序还是一个不错的选择。
//插入排序
function insertSort($arr){
$count=count($arr);
for($i=1;$i《$count;$i++){
$tem=$arr[$i];
$j=$i-1;
while ($arr[$j]》$tem){
$arr[$j+1]=$arr[$j];
$arr[$j]=$tem;
$j--;
}
}
return $arr;
}
2.选择排序
思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
示例:
[初始关键字] [49 38 65 97 76 13 27
49]
第一趟排序后 13 [38 65 97 76 49 27
49]
第二趟排序后 13 27 [65 97 76 49 38
49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [49 97 65 76]
第五趟排序后 13 27 38 49 49 [97 97 76]
第六趟排序后 13 27 38 49 49 76 [76 97]
第七趟排序后 13 27 38 49 49 76 76 [ 97]
最后排序结果 13 27 38 49 49 76 76 97
时间复杂度:
时间复杂度为o(n2),不稳定排序,适合规模比较小的
//选择排序
function selectSort($arr){
$count = count($arr);
for($i=0;$i《$count-1;$i++){
$k=$i;
for($j=$i+1;$j《$count;$j++){
if($arr[$k]》$arr[$j])
$k=$j;
}
$temp=$arr[$i];
$arr[$i]=$arr[$k];
$arr[$k]=$temp;
}
return $arr;
}
3.冒泡排序
思想:
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
示例:
49 13 13 13 13 13 13
13 38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97
时间复杂度:
该算法的时间复杂度为O(n2)。但是,当原始关键字序列已有序时,只进行一趟比较就结束,此时时间复杂度为O(n)。
//冒泡排序
function bubbleSort($arr){
$count = count($arr);
if ($count 《= 0) return false;
for($i=0;$i《count($arr);$i++){
$flag = false; //本趟排序开始前,交换标志应为假
for($j=count($arr)-1;$j》$i;$j--){
if($arr[$j-1]》$arr[$j]){
$temp=$arr[$j-1];
$arr[$j-1]=$arr[$j];
$arr[$j]=$temp;
$flag=true;
}
}
if(! $flag)//本趟排序未发生交换,提前终止算法
return $arr;
}
//return $arr;
}
4.快速排序
思想:
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
时间复杂度:
快速排序主体算法时间运算量约O(log2n),划分子区函数运算量约O(n),所以总的时间复杂度为O(nlog2n),它显然优于冒泡排序O(n2).可是算法的优势并不是绝对的。试分析,当原文件关键字有序时,快速排序时间复杂度是O(n2),这种情况下快速排序不快。而这种情况的冒泡排序是O(n),反而很快。在原文件记录关键字无序时的多种排序方法中,快速排序被认为是最好的一种排序方法。
//快速排序
function quickSort($arr){
if(count($arr)《=1)
return $arr;
$key=$arr[0];
$left_arr=array();
$right_arr=array();
for($i=1;$i《count($arr);$i++){
if($arr[$i]《=$key){
$left_arr[]=$arr[$i];
}else{
$right_arr[]=$arr[$i];
}
}
$left_arr=quickSort($left_arr);
$right_arr=quickSort($right_arr);
return array_merge($left_arr,array($key),$right_arr);
}
$arr=array(49,38,65,97,76,13,27,49);
print_r(quickSort($arr));
// 二分法查找
function binarysearch($arr, $value, $start = 0, $end = NULL)
{
if($end == NULL) $end = count($arr) - 1;
$index = floor(($start+$end)/2);
$base = $arr[$index];
if($value 《 $base) return binarysearch($arr, $value, $start,
$index-1);
else if($value 》 $base) return binarysearch($arr, $value, $index+1,
$end);
else return $index;
}
$arr = array(1, 3, 5, 6, 7, 8, 10, 12, 14, 16, 18, 20);
$value = 8;
echo binarysearch($arr, $value);
php二分法实力,php常见的几种排序以及二分法查找相关推荐
- php常见的几种排序以及二分法查找
<?php 1.插入排序 思想: 每次将一个待排序的数据元素插入到前面已经排好序的数列中,使数列依然有序,知道待排序数据元素全部插入完为止. 示例: [初始关键字] [49] 38 65 97 ...
- Java面试宝典系列之基础面试题-常见的几种排序算法-插入、选择、冒泡、快排、堆排等
常见的几种排序算法-插入.选择.冒泡.快排.堆排: https://blog.csdn.net/zhangerqing/article/details/8831542
- 最常见的几种排序算法原理和C#实现类库
本文尽量用简单直白通俗易懂深入浅出详实通透的手法将常见的几种排序算法的原理和代码呈现给众位,欢迎批评指教! 为简单起见,本文所述排序默认都以升序排序为例.(当然最后给出的源代码是升序降序都有的) 冒泡 ...
- Java常见的几种排序算法-插入、选择、冒泡、快排、堆排等
本文就是介绍一些常见的排序算法.排序是一个非常常见的应用场景,很多时候,我们需要根据自己需要排序的数据类型,来自定义排序算法,但是,在这里,我们只介绍这些基础排序算法,包括:插入排序.选择排序.冒泡排 ...
- 常见的五种排序,冒泡排序,选择排序,插入排序,并归排序,快速排序
冒泡排序 冒泡排序介绍: 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地跑过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小)那么它就会按照大到小的 ...
- 常见的几种排序算法的时间复杂度
一. 排序算法的介绍 概述:排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类 (1) 内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序. (2) 外部排序:数据 ...
- 常见的10种排序算法
前言 排序算法是在生活中随处可见,也是算法基础 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比 ...
- Java中数组常见的几种排序方法!
数组的定义: int[] arr = new int[5];int[] arr1 = {1,2,3,4,5};long[] arr2 = new long[6];String[] strs = new ...
- php排序算法有哪些,PHP常见的几种排序算法
一.冒泡排序 排序原理:对一组数据,比较相邻数据的大小,把小的数据放在前面,值大的放在后面(升序排序) 举例说明: $arr = [6, 3, 8, 2, 9, 1]; 第一轮排序: 第一次比较 6和 ...
最新文章
- 在多台FMS服务器之间共享流
- unix环境汇编语言常用工具
- STM32-超级终端显示日历
- UVA 10341 二分搜索
- iphone个系列尺寸_最值得入手的4款iPhone,都是内行人的最爱,拿出去有面子
- 大数据分析五步法流程顺序
- 遥感软件envi5.31
- 灭屏取消过温减流功能
- Monkey Test
- 二阶低通有源滤波器设计与仿真测试
- Ques1,debug模式打不开的原因
- 随机过程之平稳过程与各态历经过程
- Word排版过程中多个参考文献一起引用
- 三年半 Java 后端鹅厂面试经历
- 【NLP】讯飞英文学术论文分类挑战赛Top10开源多方案--1 赛后总结与分析
- 快的买大黄蜂是福是祸?
- 别总说CMS、G1,该聊聊ZGC了
- python 梦幻西游_GitHub - BestBurning/mhxy: tensorflow实践:梦幻西游人物弹窗识别
- gcc报错 can not be used when making a shared object; recompile with -fPIC
- 妙味课堂ajax教程,前后端高级实战 | Node.js 实战开发:博客系统【妙味课堂】