functionmergeSort(arr) { var len=arr.length; // left和right分割到最小为只有一个元素的数组 if(len<2){ return arr; } // 找中间值,根据中间值把数组分为更小的两个数组 var middle=Math.floor(len/2); var left=arr.slice(0,middle); var right=arr.slice(middle);
functionquickSort(arr, left, right) { var len = arr.length, partitionIndex, left = typeof left != 'number' ? 0 : left, right = typeof right != 'number' ? len - 1 : right;
if (left < right) { partitionIndex = partition(arr, left, right); quickSort(arr, left, partitionIndex-1); quickSort(arr, partitionIndex+1, right); } return arr; } functionpartition(arr, left ,right) { // 分区操作 var pivot = left, // 设定基准值(pivot) index = pivot + 1; for (var i = index; i <= right; i++) { if (arr[i] < arr[pivot]) { // 每次找到一个比基准大,一个比基准小的交换 if(i!==index) swap(arr, i, index); index++; } } // 交换基准与最后一个比基准小的,即所有比基准小的都在基准前面了 swap(arr, pivot, index - 1); return index-1; } // 下文省略swap函数 functionswap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
var len; functionbuildMaxHeap(arr) { // 建立大顶堆 len = arr.length; for (var i = Math.floor(len/2); i >= 0; i--) { heapify(arr, i); } } functionheapify(arr, i) { // 堆调整 // i为当前节点,left和right为其左右子节点 var left = 2 * i + 1, right = 2 * i + 2, largest = i;
// 然后假设当前节点为最大节点,判断子节点是否比它大,把最大的节点交换到当前节点 if (left < len && arr[left] > arr[largest]) { largest = left; }
if (right < len && arr[right] > arr[largest]) { largest = right; }
if (largest != i) { swap(arr, i, largest); heapify(arr, largest); } } functionheapSort(arr) { buildMaxHeap(arr); for (var i = arr.length-1; i > 0; i--) { swap(arr, 0, i); len--; heapify(arr, 0); } return arr; }