• 选择排序直接选择排序和堆排序


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

    直接选择排序:从第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),是不稳定排序。

  • 相关阅读:
    使用批处理查找某个文件夹及其子文件夹(递归地)中存在的空文件夹
    pl/sql连接oracle
    JSON对象转换成url参数
    创建maven工程
    线程同步
    java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用
    Thread操作
    java.lang.io包的使用
    用程序打印汉字
    java程序员应该熟练掌握的技术
  • 原文地址:https://www.cnblogs.com/kuikui/p/2859013.html
Copyright © 2020-2023  润新知