javascript quicksort quick sort, insertion sort 三分中值法 快速排序 插入排序
阿新 • • 發佈:2018-11-15
* Arr.js
function Arr() { this.cmp = Arr.defaultCompareFunction; } Arr.prototype = []; Arr.fromArray = function(/*Array */a) /* :Arr */ { var t = null, _this = new Arr(); for (var i = 0; i < a.length; i++) { _this.push(a[i]); } return _this; }; Arr.fromString = function (/* String */ s) /*:Arr */ { var _this = new Arr(); for (var i = 0; i < s.length; i++) { _this.push(s.charAt(i)); } return _this; }; Arr.defaultCompareFunction = function(a, b) {return a - b;}; Arr.prototype.exch = function(/*int*/ i, /*int */j) /* :Arr */ { if (i === j) {return;} var t = this[i]; this[i] = this[j]; this[j] = t; return this; }; Arr.prototype.shuffle = function() /*:Arr*/ { var m = this.length; while (m) { var i = Math.floor(m-- * Math.random()); this.exch(i, m); } return this; }; Arr.prototype.isSorted = function(/* function */ c) /* :boolean */ { c = c || this.cmp; for (var i = 1; i < this.length; i++) { if (c(this[i], this[i-1]) < 0) {return false;} } return true; }; Arr.prototype.insertionsort = function(/* function */ c) /* :Arr */ { this.cmp = c || Arr.defaultCompareFunction; return this._insertionsort(0, this.length-1); }; Arr.prototype._insertionsort = function(/* int */left, /* int */ right) /* :Arr */ { for (var p = left + 1; p <= right; p++) { var tmp = this[p]; for (var j = p; j > left && this.cmp(this[j-1], tmp) > 0; j--) { this[j] = this[ j-1 ]; } this[j] = tmp; } return this; }; Arr.prototype._median3 = function(/* int */ left, /* int */right) /* :ElementType */ { var center = Math.floor((left+right)/2); if (this.cmp(this[left], this[center]) > 0) { this.exch(left, center); } if (this.cmp(this[left], this[right]) > 0) { this.exch(left, right); } if (this.cmp(this[center], this[right]) > 0) { this.exch(center, right); } /* this[left] <= this[center] <= this[right] */ this.exch(center, right-1); /* hide pivot */ return this[right-1]; /* return pivot */ }; Arr.CUTOFF = 3; Arr._qsort = function(/*Arr*/a, /*int */left, /* int */right) /* :Arr */ { var i, j; /* int */ var pivot; /* ElementType */ if (left + Arr.CUTOFF <= right) { pivot = a._median3(left, right); i = left; j = right -1; for (;;) { while (a.cmp(a[++i], pivot) < 0) {} while (a.cmp(a[--j], pivot) > 0) {} if (i < j) { a.exch(i, j); } else { break; } } a.exch(i, right-1); /* restore pivot */ Arr._qsort(a, left, i-1); Arr._qsort(a, i+1, right); } else { a._insertionsort(left, right); } }; Arr.prototype.qsort = function(/* function */ c) { this.cmp = c || Arr.defaultCompareFunction; Arr._qsort(this, 0, this.length-1); return this; }; Arr.prototype.toString = function() { if (this.length<1) {return "[]"} var s = "["; for (var i = 0; i < this.length-1; i++) { s = this[i].toString() + ", "; } s += this[i].toString() + "]"; return s; }; exports.Arr = Arr;
* index.js
/** * Created by Mch on 2018/11/14. */ var Arr = require('./Arr').Arr; var a = Arr.fromArray([1,7,3,2,8,9,6,4,5,0]); a.qsort(); console.log(a.isSorted()); var sa = Arr.fromString("quicksortexample"), strcmp = function(a, b) { a = a || ""; b = b || ""; for (var i = 0; i < a.length && i < b.length; i++) { if (a.charCodeAt(i) < b.charCodeAt(i)) { return -1; } else { return 1; } } return a.length === b.length ? 0 : a.length < b.length ? -1 : 1; }; // sa.insertionsort(strcmp); console.log(sa); sa.qsort(strcmp); console.log(sa.isSorted()); console.log(sa.join(''));