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

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

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

 

 

 

posted @ 2013-01-13 23:14  前端咖  阅读(563)  评论(0编辑  收藏  举报