您的位置:首页 > 其它

几种简单的排序算法

2013-12-16 13:45 260 查看
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

=============================

<?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>

=================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: