排序算法(冒泡,选择,插入,快速)查找算法(二分,快速)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法(冒泡,选择,插入,快速)查找算法(二分,快速)相关的知识,希望对你有一定的参考价值。
四种排序算法
1.冒泡排序
思路分析:从前往后相邻的两个数一次进行比较,大的往下沉,小的网上 冒。当相邻的两个数的比较后发现他们的排序与排序要求相反,就互换。
代码实现
$arr = array (1,42,33,69,7,82,34,54,70,99);
$len = count($arr);
For($i=1;$i<$len;$i++){
For($j=0;$j<$len-$i;$j++){
If($arr[$j] > $arr[$j+1]){
$tmp = $arr[$j+1];
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
}
}
} 外层循环此处,内层循环轮数(冒出一个,比较一次)。
2.选择排序
思路分析:选出最小的一个数与第一位的数交换。然后在剩下的数当中再找最小的与第二位置的数交换,如此循环到最后为止。
代码实现:
$arr = array (1,42,33,69,7,82,34,54,70,99);
$len = count($arr);
For($i=0;$i<$len-1;$i++){
$p=$i; 假设最小的值
For($j=$i+1;$j<$len;$j++){
If($arr[$p]>$arr[$j]){
$p = $j; 发现更小的,记录下最小值的位置,下次用小的比
}
}
已经确定了当前最小值的位置,保存到$p中,如果发现最小值的位置与当前假设的位置$i不同,则互换。
If($p != $i){
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
3.插入排序
思路分析:把N个数插入到已排列好的顺序的数组中,使这N个数也是排序好的。
代码实现:
$arr = array (1,42,33,69,7,82,34,54,70,99);
$len = count($arr);
For($i=1;$i<$len;$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;
}
}
}
4.快速排序
思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。 通过一趟扫描,讲排序列分成两部分,一部分比基准元素小,一部分大于 等于基准元素。此时基准 元素在其排好序后的正确位置,然后再用同样的 方法递归地排序划分的两部分。
代码实现:
$arr = array (1,42,33,69,7,82,34,54,70,99);
Function digui($arr){
$len = count($arr);
If($len <= 1){
Return $arr; 是否要继续执行
}
$base_num = $arr[0];
$left_array = array();
$right_array = array();
For($i=1;$i<$len;$i++){
If($base_num > $arr[$i]){
$left_array[] = $arr[$i];
}else{
$right_array[] = $arr[$i];
}
}
$left_array = digui($left_array);
$right_array = digui($right_array);
Return array_merge($left_array,array($base_num),$right_array);
}
两种查找算法
1.二分查找
思路分析:
1.先取数组中间的值floor(low+top/2)
2.然后通过与所需查找的数字进行比较,若比中间值大,则将首位 替换 为 中间位置的下一位,继续第一步的操作。若比中间值小, 则将尾值 替换 为中间值的上 一个位置,继续第一步操作。
3.重复第二步操作直到找出目标数字。
比如从1,3,9,23,54中查找23。
首位置为0。尾位置为4,中间位置为2值为9,比23小。则首位置 更 新为2+1既为3。那么接下来中间位置就为(3+4)/2=3, 值为 23,比 较相等既找到。
代码实现:
非递归:
$target是要查找的目标 $arr是已经排序好的数组
function binary(&$arr,$low,$top,$target){
while($low <= $top){//由于php取商是有小数的,所以向下取整,不过也可不加,数组也会取整
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
$low = $mid+1;
}else{
$top = $mid-1;
}
}
return -1;
}$arr = array(1,3,9,23,54);echo binary($arr, 0, sizeof($arr), 9)
递归:
function binaryRecursive(&$arr,$low,$top,$target){
if($low<=$top){
$mid = floor(($low+$top)/2);
if($arr[$mid]==$target){
return $mid;
}elseif($arr[$mid]<$target){
return binaryRecursive($arr,$mid+1,$top,$target);
}else{
return binaryRecursive($arr,$low,$mid-1,$target);
}
}else{
return -1;
}
}
$arr = array(1,3,9,23,54);
echo binaryRecursive($arr, 0, sizeof($arr), 9);
1.快速查找
思路分析:太简单 直接上代码。
代码实现:
$arr = array(40,99,700,0,-5);
Function search($arr,$findVal){
$flag = false;
For($i=0;$i<count($arr);$i++){
If($findVal==$arr[$i]){
Echo “找到了,下标=$i”;
$flag = true;
}
}
If(!$flag){
Echo “查无此人”;
}
}
以上是关于排序算法(冒泡,选择,插入,快速)查找算法(二分,快速)的主要内容,如果未能解决你的问题,请参考以下文章
Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序
Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序