zoukankan      html  css  js  c++  java
  • 选择排序直接选择排序和堆排序

    选择排序:基本思想是依次从待排序中选择出关键字值最小的记录、关键字值次之的记录……,并分别将它们定位到序列左侧的第一个位置、第二个位置……,从而使待排序的记录序列成为按关键字值由小到大排列的有序序列。

    直接选择排序:从第i个无序列表arr[i...n]中,选择关键字值最小的记录将其插入有序列表的末尾arr[n-i+1],交换一次位置。

    function selectionSort(arr){
        var n = arr.length;
        for(var i = 0; i<n-1; i++){
            var tmp = i;
            for(var j = i+1; j <n;j++){
                if(arr[tmp]>arr[j]){
                    tmp = j;
                }
            }
            var tmpnum = arr[tmp];
            arr[tmp] = arr[i];
            arr[i] = tmpnum;
        }
        return arr;
    }
                
    var arr = [51,33,62,96,87,17,28,51];
                
    selectionSort(arr);

    直接选择排序的平均时间复杂度O(n2),是不稳定排序。

    堆排序:满足完全二叉树特性,其坐、右子树分别是堆,任何一个结点的值不大于或不小于左/右孩子结点的值。
    堆排序分别称小顶堆、大顶堆。

    function sift(arr,p,len){
        var tmp = arr[p];
        var c = 2*p+1;
        while(c<len){
            if(c+1<len && arr[c] <arr[c+1]){
                c++;
            }
            if(tmp>=arr[c]){
                break;
            }
            arr[p] = arr[c];
            p = c;
            c = 2*p+1;
        }
        arr[p] = tmp;
    }
                
    function heapsort(arr){
        for(var i = parseInt(arr.length/2)-1;i>=0;i--){
            sift(arr,i,arr.length);
        }          
        for(var i= arr.length-1;i>0;i--){
            var tmp = arr[0];
            arr[0] = arr[i];
            arr[i]= tmp;
            sift(arr,0,i);
        }
    }
                
    var arr = [51,33,62,96,87,17,28,51];
    heapsort(arr);
    console.log("小顶堆:"+arr);

    堆排序的时间复杂度O(nlog2n),是不稳定排序。

  • 相关阅读:
    如何使用dig命令挖掘域名解析信息
    网络地址转换 NAT 配置
    Win10 安装子系统 GUI 界面
    送给发烧友:Python条件语句的七种写法T
    这是一个可以显示Linux命令的工具
    网页游戏破解 我是武神
    仙侠道破解
    心动最新页游 仙侠道 破解笔记
    通用网页游戏伤害公式。
    mysql: error while loading shared libraries: libmysqlclient.so.16
  • 原文地址:https://www.cnblogs.com/kuikui/p/2859013.html
Copyright © 2011-2022 走看看