1. 程式人生 > >javascript quicksort quick sort, insertion sort 三分中值法 快速排序 插入排序

javascript quicksort quick sort, insertion sort 三分中值法 快速排序 插入排序

* 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(''));