Array yang diselenggarakan berarti mengganggu urutan semua elemen dalam array.
Metode umum adalah meneruskan fungsi ke metode sortir asli array, yang secara acak mengembalikan 1 atau -1 untuk mencapai tujuan mengatur elemen array secara acak.
Salinan kode adalah sebagai berikut:
arr.sort (function (a, b) {return math.random ()>. 5? -1: 1;});
Meskipun metode ini intuitif, tidak efisien. Setelah tes saya, itu mengacaukan array 10.000 elemen, dan waktu yang dibutuhkan adalah sekitar 35ms (Firefox)
Saya selalu memiliki kualitas yang sangat baik untuk memecahkan casserole untuk menanyakan akhir, jadi saya menemukan metode yang efisien. Lihat teks asli ini
Salinan kode adalah sebagai berikut:
if (! array.prototype.shuffle) {
Array.prototype.shuffle = function () {
untuk (var j, x, i = this.length; i; j = parseInt (math.random () * i), x = this [-i], ini [i] = ini [j], ini [j] = x);
kembalikan ini;
};
}
arr.shuffle ();
Metode ini menambahkan fungsi ke array.prototype, yang disebut shuffle - tetapi namanya tidak masalah, yang penting adalah efisiensinya.
Ambil array 10.000 elemen di atas untuk mengujinya. Hanya perlu 7 atau 8 milidetik untuk menyelesaikannya di luar pesanan menggunakan metode ini.
Tingkatkan elemen array sebesar 10 kali hingga 100.000 untuk pengujian. Metode sortir pertama membutuhkan sekitar 500+ms, dan metode shuffle memakan waktu sekitar 40ms. Perbedaannya sangat besar.
Kode Tes Lengkap:
Salinan kode adalah sebagai berikut:
var count = 100000, arr = [];
untuk (var i = 0; i.5? -1: 1;});
Array.prototype.sort.call (arr, function (a, b) {return math.random ()>. 5? -1: 1;});
Document.write (arr+'
');
var t1 = tanggal baru (). getTime ();
Document.write (T1-T);
// Metode berikut paling efisien
if (! array.prototype.shuffle) {
Array.prototype.shuffle = function () {
untuk (var j, x, i = this.length; i; j = parseInt (math.random () * i), x = this [-i], ini [i] = ini [j], ini [j] = x);
kembalikan ini;
};
}
var t = tanggal baru (). getTime ();
arr.shuffle ();
Document.write ('
'+arr+'
');
var t1 = tanggal baru (). getTime ();
Document.write (T1-T);
Selain itu, pernahkah Anda memperhatikan loop dalam kode shuffle? Itu tidak memiliki babak kedua! Artinya, hanya ada untuk (..) tetapi bukan yang berikut {..}, jadi Anda bisa menulis dengan cara ini! Dan itu benar -benar dieksekusi secara normal! Ini sangat penasaran, saya harus pergi ke taman blog untuk ditanyakan.