选择排序---直接选择排序和堆排序
选择排序:基本思想是依次从待排序中选择出关键字值最小的记录、关键字值次之的记录……,并分别将它们定位到序列左侧的第一个位置、第二个位置……,从而使待排序的记录序列成为按关键字值由小到大排列的有序序列。
直接选择排序:从第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),是不稳定排序。