4种基本排序&2种查找

<?php

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

showArray($arr);

/**

* 遍历打印数组

* @param string $type  排序方式

* @param array $arr    排序数组

*/

function showArray($arr,$type=‘原数组‘){

echo "$type:<br/>";

foreach ($arr as $v){

echo ‘ ‘.$v.‘ ‘;

}

echo ‘<br/>‘;

}

/**

* 冒泡排序

* 从小到大,大边界逐渐下降

* @param array $arr

*/

function bubbleSort($arr){

for($i=0;$i<count($arr)-1;$i++){

for ($j = 0; $j < count($arr)-1-$i; $j++) {

if($arr[$j]>$arr[$j+1]){

$temp=$arr[$j+1];

$arr[$j+1]=$arr[$j];

$arr[$j]=$temp;

}

}

}

return $arr;

}

// showArray(bubbleSort($arr),‘冒泡排序‘);

/**

* 选择排序

* 找出最小值,小边界逐渐向大收缩

* @param array $arr

*/

function selectSort($arr){

for ($i = 0; $i < count($arr); $i++) {

$minVal=$arr[$i];

$minIndex=$i;

for ($j = 0+1+$i; $j < count($arr); $j++) { //自己不用比 +1  小边界逐渐收缩 +$i

if ($minVal>$arr[$j]){  //找出最小值,为了比对最后一位

$minVal=$arr[$j];

$minIndex=$j;

}

}

$temp=$arr[$i];

$arr[$i]=$minVal;

$arr[$minIndex]=$temp;

}

return $arr;

}

// showArray(selectSort($arr),‘选择排序‘);

/**

* 插入排序

* 没有边界控制,利用minI向左偏移对比,达成就数组右移空位,插入

* @param array $arr

*/

function insertSort($arr){

for ($i = 1; $i < count($arr); $i++) {  //从1开始,向-1位对比

$minV=$arr[$i];

$minI=$i-1;

while ($minI>=0 && $minV<$arr[$minI]) {  //向左对比,达成就右移空出$minV位置

$arr[$minI+1]=$arr[$minI];

$minI--;

}

$arr[$minI+1]=$minV;

}

return $arr;

}

// showArray(insertSort($arr),‘插入排序‘);

/**

* 快速排序

* @param unknown $arr

* @return unknown|multitype:

*/

function quickSort($arr){

if(count($arr)<=1) return $arr;

$flag=$arr[0];

$left=array();

$right=array();

for ($i = 1; $i < count($arr); $i++) {

if($arr[$i]>$flag){

$left[]=$arr[$i];

}else {

$right[]=$arr[$i];

}

}//分完大小一次,再分

$left=quickSort($left);

$right=quickSort($right);

return array_merge($right,array($flag),$left);

}

// showArray(quickSort($arr),‘快速排序‘);

/**

* 二分法查找

* @param unknown $a

* @param unknown $val

* @return number

*/

function binarySearch($a, $val) {

$low = 0;

$high = count ( $a ) - 1;

while ( $low <= $high ) {

$mid = intval ( ($low + $high) / 2 );

if ($a [$mid] == $val)

return $mid;

if ($a [$mid] > $val) {

$high = $mid - 1;

} else {

$low = $mid + 1;

}

}

return - 1;

}

$a=quickSort($arr);

echo binarySearch($a, 7);

/**

*顺序查找

*/

function search(&$arr,$findVal){

$flag=false;

for($i=0;$i<count($arr);$i++){

if($findVal==$arr[$i]){

echo "找到了,下标为=$i";

$flag=true;

//break;

}

}

if(!$flag){

echo ‘查询不到‘;

}

}

search($arr,-1);

4种基本排序&2种查找

时间: 2024-11-02 11:12:10

4种基本排序&2种查找的相关文章

笔试算法题(53):四种基本排序方法的性能特征(Selection,Insertion,Bubble,Shell)

四种基本算法概述: 基本排序:选择,插入,冒泡,希尔.上述算法适用于小规模文件和特殊文件的排序,并不适合大规模随机排序的文件.前三种算法的执行时间与N2成正比,希尔算法的执行时间与N3/2(或更快)成正比: 前三种算法在平均,最坏情况下都是N2,而且都不需要额外的内存:所以尽管他们的运行时间只相差常数倍,但运行方式不同: 对于已经就序的序列而言,插入排序和冒泡排序的运行时间都是O(N),但是选择排序的时间仍旧是O(N^2): 因为Insertion和Bubble都是相邻项间的比较交换,所以不会出

JavaScript版几种常见排序算法

今天发现一篇文章讲“JavaScript版几种常见排序算法”,看着不错,推荐一下原文:http://www.w3cfuns.com/blog-5456021-5404137.html 算法描述: * 冒泡排序:最简单,也最慢,貌似长度小于7最优* 插入排序: 比冒泡快,比快速排序和希尔排序慢,较小数据有优势* 快速排序:这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合* 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快* 系统方法:在forfox下系

8种主要排序算法的C#实现

新的一年到了,很多园友都辞职要去追求更好的工作环境,我也是其中一个,呵呵! 最近闲暇的时候我开始重温一些常用的算法.老早就买了<算法导论>,一直都没啃下去. 这本书确实很好,只是太难读了,总是读了几章就又读不下去了!工作上也几乎用不到. 我这段时间发现看这些排序算法比以前容易了很多,就借此机会将它们整理总结起来. 一是方便以后重温,二是可以应对笔试面试.同时也希望这篇博文可以帮助各位刚辞职和正在学习排序算法的园友. PS:有可能实现的代码并不是最优的,如果有什么错误或者值得改进的地方,还请大家

7种基本排序算法的Java实现

7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 1 /** 2 * 直接插入排序 3 * 不稳定 4 * 时间复杂度:O(n^2) 5 * 最差时间复杂度:O(n^2) 6 * 空间复杂度:O(1) 7 * 使用场景:大部分元素有序 8 * @param elements 9 * @param comparator 10 * @param <T> 11 */ 1

C#12种顺序排序

这篇主要写关于顺序排序的十二种算法,也是我有关算法的第一帖.主要是写,对每种算法的理解与测试. 速度测试,主要根据一千.一万.五万.百万这 四种.速度纪录还是用Stopwatch 这个类.使用随机数Random生成随机的集合. 其中数量五万左右的小数量排序,使用快速排序,速度最快.大数量百万左右使用鸽巢排序,速度最快.废话不多说,接下来上代码. 第一种:冒泡排序 冒泡排序我相信是每个程序员,都会学到的一种比较排序算法.非常简单,通过多次重复比较每对相邻元素,并按规定的顺序交换他们,最终把数列进行

几种内部排序-分类-复杂性-稳定性

1. 简述 本文主要说明一些常用的内部排序算法的分类.复杂性和稳定性.主要基于现在的理解和学习,详细准确的复杂度可以参见维基百科等比较权威的网站,对于一些算法的不同实现,复杂度也不同,这里给出的复杂度都是相对较好的算法的复杂度. 2. 分类    3. 复杂性和稳定性 冒泡排序:在已经有序的情况,取得O(N)的复杂度.    快速排序:每次递归都是N的复杂度,递归次数根据序列有关系,当已经有序的情况下,递归N次,时间复杂度为O(N*LogN)    插入排序:在已经有序的情况,取得O(N)的复杂

算法复杂度,及三种主要排序算法的研究

一.时间复杂度 1.时间频度  T(n),n为问题的规模 即--算法中语句的执行次数.又叫语句频度. 2.时间复杂度 记作 O( f(n) ),这里的f(n)是一个T(n)的同数量级函数. 如O(1)表示算法的语句执行次数为一个常数,不随规模n的增长而增长: 又如T(n)=n^2+3n+4与T(n)=4n^2+2n+1它们的频度不同, 但时间复杂度相同,都为O(n^2). 3.算法的性能 主要用算法的 时间复杂度 的数量级来评价一个算法的时间性能. 二.空间复杂度 S(n),包括3方面: 1.算

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

几种常见排序算法

几种常见排序算法 几种常见排序算法 写在前面 基础介绍 初级排序算法 selection sort选择排序 insertion sort插入排序 ShellSort希尔排序 shuffing不是排序算法 merge sort归并排序 Abstract in-place merge原地归并的抽象方法 Top-down mergesort自顶向下的归并排序 Bottom-up mergesort自底向上的归并排序 quicksort 三向切分的快速排序 Heapsort堆排序 总结和比较 命题 本文