zoukankan      html  css  js  c++  java
  • QuickSort

    <script type="text/javascript">

    • 快速排序

    //快速排序
    //思想:每次都把待排序的序列分成两组,左边的比关键字大
    //右边的比关键字小,关键字的位置就是有序的时候它的位置
    //时间复杂度:时间复杂度与选取的关键字,如果关键字是平衡二叉树的
    //跟节点,递归次数为平衡二叉树的高度O(nlogn); 平均O(nlogn)
    //若是一颗斜的排序二叉树,递归n-1次;O(n2)
    //空间复杂度:最好/平均O(log n) 最坏O(n)
    //稳定性:不稳定
    function QuickSort(obj)
    {
        //分割待排序的序列
        QSort(obj.data,1,obj.length);
        //QSort1(obj.data,1,obj.length);
    }
    //交换两个数的位置
    function swap(arr,i,j)
    {
        var temp=arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
    //对序列做快速排序
    function QSort(arr,low,high)
    {
        var k;
        if(low<high)
        {
          k=Partition(arr,low,high);
          QSort(arr,low,k-1);
          QSort(arr,k+1,high);
        }
    }
    //用关键字分割待排序的序列
    function Partition(arr,low,high)
    {
    //可以用三数取中法选出关键字
        SelectCenter(arr,low,high);
        var key=arr[low];
        while(low<high)
        {
          /*while(low<high && key<=arr[high])
              high--;
          swap(arr,low,high);
          while(low<high && key>=arr[low])
              low++;
          swap(arr,low,high);*/
          //可以减少交换次数
          while(low<high && key<=arr[high])
              high--;
          arr[low]=arr[high];
          while(low<high && key>=arr[low])
              low++;
          arr[high]=arr[low];
        }
          arr[low]=key;
          return low;
    }
    //直接插入排序
    function InsertSort(obj)
    {
        var temp;
        for(var i=1;i<obj.length;i++)
        {
          if(obj.data[i]>obj.data[i+1])
          {
            temp=obj.data[i+1];
            while(obj.data[i]>temp&&i>0)
            {
              obj.data[i+1]=obj.data[i];
              i--;
            }
            obj.data[i+1]=temp;
          }
        }
    }
    //优化:由于快速排序用到了递归,当待排序的数组很小时,他的
    //效率不如直接插入排序
    function QSort1(arr,low,high)
    {
        var k;
        //当子序列小于7时用直接插入排序
        if(high-low>7)
        {
          k=Partition(arr,low,high);
          QSort(arr,low,k-1);
          QSort(arr,k+1,high);
        }
        else
        {
          InsertSort(obj);
        }
    }
    //优化:快速排序的时间复杂度与关键字的选择有关
    //所以总用第一个选取并不总是最好的
    //三数取中法
    function SelectCenter(arr,low,high)
    {
        var i=Math.floor(low+(high-low)/2);
        if(arr[low]>arr[i])
          swap(arr,low,i);
        if(arr[i]>arr[high])
          swap(arr,i,high);
        if(arr[low]<arr[i])
          swap(arr,low,i);
    }
    //待排序的序列,第一个数不参与
    var obj={
        data:[0,-11,2,-36,2,200,34,11],
        length:7
        }
    QuickSort(obj);
    console.log(obj.data);
    </script>

  • 相关阅读:
    php无刷新上传图片和文件
    wamp(win1064位家庭版+apache2.4.20+php5.5.37+mysql5.5.50)环境搭建
    linux下常见解压缩命令
    nginx虚拟主机配置小结
    Nginx下配置ThinkPHP的URL Rewrite模式和pathinfo模式支持
    iframe 高度自适应/以及在ie8中空白问题
    小程序-调用公共js对象方法/ app.js
    小程序-tabbar相关样式设置
    微信小程序连接无法跳转/ can not navigate to tabBar page错误
    微信小程序-tabBar无法显示问题解析
  • 原文地址:https://www.cnblogs.com/yiluhuakai/p/7751033.html
Copyright © 2011-2022 走看看