几种简单的排序算法

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


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


<?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)的额外空间的排序),因而从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。


使用插入排序为一列数字进行排序的过程

分類

排序算法

數據結構

数组

最差時間複雜度

189317b4b935a745fcfaf95940d2b4f0.png

最優時間複雜度

7ba55e7c64a9405a0b39a1107e90ca94.png

平均時間複雜度

189317b4b935a745fcfaf95940d2b4f0.png

最差空間複雜度

总共7ba55e7c64a9405a0b39a1107e90ca94.png ,需要辅助空间5e079a28737d5dd019a3b8f6133ee55e.png

算法描述[编辑]

一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置后
  6. 重复步骤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****** ",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>

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


原文地址:https://www.cnblogs.com/fuhaots2009/p/3476632.html