zoukankan      html  css  js  c++  java
  • 几种简单的排序算法

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


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


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

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


  • 相关阅读:
    boostrapvalidator
    bootstrap 整理
    emil 的使用
    sass笔记
    sql 语句的优化
    多线程笔记
    mysql笔记
    react
    优雅的创建map/list集合
    spring中路径的注入
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3476632.html
Copyright © 2011-2022 走看看