二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
=============================
<?php
/*二分查找:前提,该数组已经是一个有序数组,必须先排序,再查找。*/
function binarySearch(&$array,$findVal,$leftIndex,$rightIndex){
$middleIndex=round(($rightIndex+$leftIndex)/2);
if($leftIndex>$rightIndex){
echo '查无此数<br/>';
return;
}
if($findVal>$array[$middleIndex]){
binarySearch($array,$findVal,$middleIndex+1,$rightIndex);
}else if($findVal<$array[$middleIndex]){
binarySearch($array,$findVal,$leftIndex,$middleIndex-1);
}else{
echo "找到数据:index=$middleIndex;value=$array[$middleIndex]<br/>";
if($array[$middleIndex+1]==$array[$middleIndex]&&$leftIndex<$rightIndex){
binarySearch($array,$findVal,$middleIndex+1,$rightIndex);
}
if($array[$middleIndex-1]==$array[$middleIndex]&&$leftIndex<$rightIndex){
binarySearch($array,$findVal,$leftIndex,$middleIndex-1);
}
}
}
$arr=array(4,5,6,7,8,9);
binarySearch($arr,8,0,count($arr));
?>
=====================================
/*快速排序:
1找基准点(一般找中间点);
2建立两个数组,比基准点的的放右边,比基准点小的放左边;
3递归调用,对左边和右边的数组排序
*/
<script>
function quick_sort(arr){
//返回条件,当数组被分割成只有一个元素,或者时空数组的时候,返回
if(arr.length<=1){
return arr;
}
//splice(起始位置,删除元素个数) 从指定位置开始,删除指定的元素个数 ,并返回被删除的元素 ,如果删除了多个元素,返回一个数组,如果不指定起始点,则删除起始点后面的元素;
var base=arr.splice(Math.floor(arr.lenght/2),1);
var left=[];
var right=[];
for(var i=0 ; i<arr.length; i++){
if(arr[i]<=base){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
//对左边和有边的数组进行递归排序,然后把左右中三部分Concat起来;
return quick_sort(left).concat(base,quick_sort(right));
}
var arr=[5,4,3,2,1];
alert(quick_sort(arr));
</script>
==============================================
插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
使用插入排序为一列数字进行排序的过程 | |
分類 | 排序算法 |
數據結構 | 数组 |
最差時間複雜度 | |
最優時間複雜度 | |
平均時間複雜度 | |
最差空間複雜度 |
|
算法描述[编辑]
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找排序。
=================================
/*C实现*/
#include <stdio.h>
void insert_sort(int * parr,int length){
int i, insert,pre_index;
for(i=1; i<length; i++){
insert=*(parr+i);
pre_index=i-1;
while(pre_index>=0 && insert<*(parr+pre_index)){
parr[pre_index+1]=parr[pre_index];
pre_index--;
}
parr[pre_index+1]=insert;
}
}
int main(){
int arr[5]={1,3,2,7,5};
int i;
insert_sort(arr,5);
for(i=0 ; i<sizeof(arr)/sizeof(int); i++){
printf("%d******\n",arr[i]);
}
return 0;
}
=================================
/*php实现*/
<?php
class Insert_sort{
public $order;
public function __construct($arr){
$this->order=$this->insert_sort($arr);
}
private function insert_sort($arr){
for($i=1; $i<count($arr); $i++){
$insert=$arr[$i];
$pre_index=$i-1;
//$pre_index>=0和$insert<= $arr[$pre_index]的顺序不能乱,否则会出错
while( $pre_index>=0&& $insert<= $arr[$pre_index]){
$arr[$pre_index+1]=$arr[$pre_index];
$pre_index--;
}
$arr[$pre_index+1]=$insert;
}
return $arr;
}
}
$arr=array(5,3,1,7,2,-1);
$sort=new Insert_sort($arr);
var_dump($sort->order);
?>
======================================
/*javascript 实现*/
<script>
function insert_sort(arr){
for(var i=1; i<arr.length; i++){
var insert=arr[i];
var pre_index=i-1;
while(pre_index>=0 && insert<arr[pre_index]){
arr[pre_index+1]=arr[pre_index];
pre_index--
}
arr[pre_index+1]=insert;
}
return arr;
}
var arr=[5,3,1,7,2,-1];
alert( insert_sort(arr) );
</script>
=================================