js实现堆排序
<script type="text/javascript"> var arr = [22, 31, 1, 9, 99, 68, 55, 30]; function heap_adjust(arr, start, end){ var temp = arr[start], j = start*2; for(;j < end; j *= 2){ if(arr[j] < arr[j+1]){ j++; } if(temp > arr[j]){ break; } arr[start] = arr[j]; start = j; } arr[start] = temp; } function heap_sort(arr){ var len = arr.length; for(var i = len/2; i >= 0; i--){ heap_adjust(arr, i, len); } for(var i = len; i > 0; i--){ swap(arr, 0, i -1); heap_adjust(arr, 0, i - 2); } } function swap(arr, i, j){ var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } heap_sort(arr) console.log(arr); </script>
堆排序要点:
1.首先我们要构建一个堆
根节点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,称为大根堆,又称最大堆(大顶堆)
根节点(亦称为堆顶)的关键字是堆里所有结点关键字中最小者,称为小根堆,又称最小堆(小顶堆)
1.1实现一个函数数组的除第一个元素外其他部分已经是一个堆,然后将这个元素添加到堆里面
1.2将要排序的数组构建成一个堆
2.将堆顶元素与最后一个元素互换,将其他的元素从新构建一个堆。
function heap_adjust(arr, start, end){ var tmp = arr[start]; var j = start * 2; if(j == 0){ j = 1; } for(; j < end; j*=2){ if(arr[j+1] > arr[j]){ j++; } if(tmp < arr[j]){ arr[start] = arr[j]; start = j; } } arr[start] = tmp; } function swap(arr, i, j){ var tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } var arr = [1, 5, 6, 9, 3, 8, 10]; var i = parseInt(arr.length/2); for(; i >=0; i--){ heap_adjust(arr, i, arr.length); } for(i = arr.length; i > 2; i--){ swap(arr, 0, i -1); heap_adjust(arr, 0, i - 2); } console.log(arr);