1 var A = [6, 0, 2, 0, 1, 3, 4, 6, 1, 3, 2]; 2 3 Array.prototype.swap = function (i, j) { 4 var temp = this[j]; 5 this[j] = this[i]; 6 this[i] = temp; 7 }; 8 9 Array.prototype.getMaxVal = function () { 10 //可以用任意我们学过的排序方法写,我们学过冒泡,选择,归并,快排,堆排序。 11 //当然这样我们只要取出最大值即可,不需要全部排序,但是为了学程序,我将给出我们已经学过的所有排序方法,并全部排序 12 var r = this.length - 1; 13 // return this.BUBBLE_SORT()[r]; 14 // return this.SELECT_SORT()[r]; 15 // return this.QUICK_SORT(0, r)[r]; 16 //heap_size = r+1; return.this.HRAP_SORT()[r]; 17 // return this.MERGE_SORT(0,r)[r]; 18 return this.INSERT_SORT()[r]; 19 }; 20 //冒泡 21 Array.prototype.BUBBLE_SORT = function () { 22 23 //冒泡就是两两将换, 24 for (var i = this.length - 1; i > 0; i--) { 25 for (var j = 0; j < i; j++) { 26 if (this[j] > this[j + 1]) { 27 this.swap(j, j + 1); 28 } 29 } 30 } 31 return this; 32 }; 33 34 35 //选择排序 36 37 Array.prototype.SELECT_SORT = function () { 38 for (var i = 0; i < this.length - 1; i++) { 39 var min = this[i]; //默认选择第一个最小; 40 var index = i; //记录最小值的坐标 41 42 for (var j = i + 1; j < this.length; j++) { 43 if (this[j] < min) { 44 min = this[j]; 45 index = j; 46 } 47 } 48 this.swap(index, i); 49 } 50 return this; 51 }; 52 53 54 //随机算法-快排 55 //思想就是分治,递归。 56 //最主要的函数就是PARTITION,返回下标i,i的左边都比A[i]小,右边比他大; 57 Array.prototype.PARTITION = function (p, r) { 58 var i = p - 1; 59 var x = this[r]; 60 for (var j = p; j <= r - 1; j++) { 61 if (this[j] < x) { 62 this.swap(++i, j); 63 64 } 65 66 } 67 this.swap(++i, r); 68 return i; 69 }; 70 71 Array.prototype.RANDOM_PARTION = function (p, r) { 72 73 var q = p + Math.round(Math.random() * (r - p)); 74 this.swap(q, r); 75 return this.PARTITION(p, r); 76 }; 77 78 Array.prototype.QUICK_SORT = function (p, r) { 79 if (r > p) { 80 var q = this.RANDOM_PARTION(p, r); 81 arguments.callee.call(this, p, q - 1); 82 arguments.callee.call(this, q + 1, r); 83 } 84 return this; 85 }; 86 87 88 //堆排序 89 //其核心函数在于MAX_HRAPTITY,总能让i位置是最大的。 90 var heap_size = 0; //包含heap_size下标在内的,之后的下标都是排序好的。 91 92 Array.prototype.HEAP_SORT = function () { 93 this.BUILD_MAX_HEAP(); 94 while (heap_size > 1) { 95 this.swap(0, --heap_size); 96 this.MAX_HEAPTIFY(0); 97 } 98 heap_size = this.length; //最后复原 99 return this; 100 }; 101 102 //生成最大堆 103 Array.prototype.BUILD_MAX_HEAP = function () { 104 105 for (var i = Math.floor(this.length / 2) - 1; i >= 0; i--) { 106 this.MAX_HEAPTIFY(i); 107 } 108 }; 109 110 //生成以i为根节点,它为最大值 111 Array.prototype.MAX_HEAPTIFY = function (i) { 112 var largest = i; 113 var l = i * 2 + 1; 114 var r = i * 2 + 2; 115 116 if (l < heap_size && this[l] > this[largest]) { 117 118 largest = l; 119 } 120 121 if (r < heap_size && this[r] > this[largest]) { 122 123 largest = r; 124 } 125 if (largest !== i) { 126 this.swap(largest, i); 127 arguments.callee.call(this, largest); 128 } 129 }; 130 131 //heap_size = A.length; 132 //归并排序 133 //其核心思想是分治,递归 134 135 Array.prototype.MERGE_SORT = function (start, end) { 136 137 if (end > start) { //记住这里没有等号,不然会一直递归下去。 138 var middle = Math.floor((start + end) / 2); 139 arguments.callee.call(this, start, middle); 140 arguments.callee.call(this, middle + 1, end); 141 this.MEAGE(start, middle, end); 142 } 143 return this; 144 }; 145 146 Array.prototype.MEAGE = function (s, m, e) { 147 var A = this.slice(s, m + 1), 148 B = this.slice(m + 1, e + 1), 149 lenA = m + 1 - s, 150 lenB = e - m, 151 i = 0, 152 j = 0; 153 154 while (i < lenA && j < lenB) { 155 A[i] < B[j] ? this[s++] = A[i++] : this[s++] = B[j++]; 156 } 157 while (i < lenA) { 158 this[s++] = A[i++]; 159 } 160 while (j < lenB) { 161 this[s++] = B[j++]; 162 } 163 }; 164 165 166 //插入排序 167 Array.prototype.INSERT_SORT = function () { 168 try { 169 if (this.length < 1) { 170 throw new Error("错误长度的数组"); 171 } 172 for (var i = 1; i < this.length; i++) { 173 var j = i - 1, 174 temp = this[i]; 175 while (this[j] > temp && j >= 0) { 176 this[j + 1] = this[j]; 177 j--; 178 } 179 this[j + 1] = temp; 180 } 181 182 } catch (e) { 183 console.error(e); 184 } finally { 185 return this; 186 } 187 };