我的思路是这样的,对一个数组原地做shiftDown操作,然后第一个元素就是有序的,然后再从第二个开始做shiftDown,第二个也是有序的,然后依次类推到最后整个数组就有序了,老师这种快吗?看下我代码可以优化吗
function shiftDown(arr, k, n, i){
//j和k是在新数组中的索引也就是减去排好序的元素重新生成的数组,他们加上i表示在原来数组中的位置
while(2*k+1 < n-i){
let j = 2*k+1;
if(j+1+i < n && arr[j+1+i] > arr[j+i])
j = j+1;
if(arr[k+i] >= arr[j+i])
break;
[arr[k+i], arr[j+i]] = [arr[j+i], arr[k+i]];
k = j;
}
}
function heapSort(arr, n){
for(let i = 0; i < n-1;i ++){
// 这里的j是在新数组中的非叶子节点的位置,加上i表示在真实数组的位置。
for(let j = Math.floor((n-i-2)/2); j >= 0; j --){
shiftDown(arr, j, n, i);
}
}
}
let arr = [7,3,6,1,9,56,78,16,15,78,56,77,77];
console.log(arr);
heapSort(arr, arr.length);
console.log(arr);