常见排序算法(下)
1 //5. 希尔排序 2 var shellSort = function(arr) { 3 var len = arr.length; 4 for (var gap = Math.floor(len / 2); gap > 0; gap = Math.floor(gap / 2)) { 5 for (var i = gap; i < len; i++) { 6 var temp = arr[i], 7 j = i - gap; 8 while (temp < arr[j] && j > -1) { 9 arr[j + gap] = arr[j]; 10 j -= gap; 11 } 12 arr[j + gap] = temp; 13 } 14 } 15 return arr; 16 }; 17 18 //6. 归并排序 19 function mergeSort(source, dest, s, t) { 20 var m, dest2 = new Array(); 21 if (s == t) { 22 dest[s] = source[s]; 23 } else { 24 m = Math.floor((s + t) / 2); 25 mergeSort(source, dest2, s, m); 26 mergeSort(source, dest2, m + 1, t); 27 merge(dest2, dest, s, m, t); 28 } 29 } 30 31 function merge(source, dest, s, m, n) { 32 for (var i = m + 1, k = s; i <= n && s <= m; k++) { 33 if (source[s] < source[i]) { 34 dest[k] = source[s++]; 35 } else { 36 dest[k] = source[i++]; 37 } 38 } 39 40 if (s <= m) { 41 for (var l = 0; l <= m - s; l++) { 42 dest[k + l] = source[s + l]; 43 } 44 } 45 if (i<= n) { 46 for (var l = 0; l <= n - i; l++) { 47 dest[k + l] = source[i + l]; 48 } 49 50 } 51 } 52 53 //7. 堆排序 54 var heapSort = function(arr) { 55 var temp, len = arr.length; 56 for (var i = Math.floor(len / 2); i >= 0; i--) { 57 heapAdjust(arr, i, len - 1); 58 } 59 for (var i = len - 1; i >= 0; i--) { 60 arraySwap(arr, 0, i); 61 heapAdjust(arr, 0, i - 1); 62 } 63 return arr; 64 }; 65 66 var heapAdjust = function(arr, start, max) { 67 var temp = arr[start]; 68 for (var i = 2 * start; i < max; i *= 2) { 69 if (i < max && arr[i] < arr[i + 1]) { 70 ++i; 71 } 72 if (temp >= arr[i]) { 73 break; 74 } 75 arr[start] = arr[i]; 76 start = i; 77 } 78 arr[start] = temp; 79 };