生活随笔
收集整理的這篇文章主要介紹了
JavaScript版几种常见排序算法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
說明
- 寫這個主要是為了鍛煉自己,并無實(shí)際意義。
- 每個瀏覽器測試得出的數(shù)據(jù)會不一樣。比如我用chrome 測試 一般快速排序都會最快,IE 則根據(jù)數(shù)組長度有可能希爾最快。
- 不要用太大數(shù)據(jù)去測試冒泡排序(瀏覽器崩潰了我不管)
- 如果有興趣可以 在線排序動畫 ?下載測試頁面
個人理解
- 冒泡排序:最簡單,也最慢,貌似長度小于7最優(yōu)
- 插入排序:?比冒泡快,比快速排序和希爾排序慢,較小數(shù)據(jù)有優(yōu)勢
- 快速排序:這是一個非常快的排序方式,V8的sort方法就使用快速排序和插入排序的結(jié)合
- 希爾排序:在非chrome下數(shù)組長度小于1000,希爾排序比快速更快
- 系統(tǒng)方法:在forfox下系統(tǒng)的這個方法非常快
// ---------- 一些排序算法
// js 利用sort進(jìn)行排序
systemSort:
function(array) {return array.sort(
function(a, b) {return a -
b;});
},
// 冒泡排序
bubbleSort:
function(array) {var i = 0
,len =
array.length,j, d;for (; i < len; i++
) {for (j = 0; j < len; j++
) {if (array[i] <
array[j]) {d =
array[j];array[j] =
array[i];array[i] =
d;}}}return array;
},
// 快速排序
quickSort:
function(array) {//var array = [8,4,6,2,7,9,3,5,74,5];//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];var i = 0
;var j = array.length - 1
;var Sort =
function(i, j) {// 結(jié)束條件if (i ==
j) {return};var key =
array[i];var stepi = i;
// 記錄開始位置var stepj = j;
// 記錄結(jié)束位置while (j >
i) {// j <<-------------- 向前查找if (array[j] >=
key) {j--
;} else {array[i] =
array[j]//i++ ------------>>向后查找while (j > ++
i) {if (array[i] >
key) {array[j] =
array[i];break;}}}}// 如果第一個取出的 key 是最小的數(shù)if (stepi ==
i) {Sort(++
i, stepj);return;}// 最后一個空位留給 keyarray[i] =
key;// 遞歸
Sort(stepi, i);Sort(j, stepj);}Sort(i, j);return array;
},// 插入排序
insertSort:
function(array) {// http://baike.baidu.com/image/d57e99942da24e5dd21b7080// http://baike.baidu.com/view/396887.htm//var array = [0,1,2,44,4,324,5,65,6,6,34,4,5,6,2,43,5,6,62,43,5,1,4,51,56,76,7,7,2,1,45,4,6,7];var i = 1
,j, step, key, len =
array.length;for (; i < len; i++
) {step = j =
i;key =
array[j];while (--j > -1
) {if (array[j] >
key) {array[j + 1] =
array[j];} else {break;}}array[j + 1] =
key;}return array;
},// 希爾排序
//Jun.array.shellSort(Jun.array.df(10000));
shellSort:
function(array) {// http://zh.wikipedia.org/zh/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F// var array = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10];var stepArr = [1750, 701, 301, 132, 57, 23, 10, 4, 1];
// reverse() 在維基上看到這個最優(yōu)的步長 較小數(shù)組//var stepArr = [1031612713, 217378076, 45806244, 9651787, 2034035, 428481, 90358, 19001, 4025, 836, 182, 34, 9, 1]//針對大數(shù)組的步長選擇var i = 0
;var stepArrLength =
stepArr.length;var len =
array.length;var len2 = parseInt(len / 2
);for (; i < stepArrLength; i++
) {if (stepArr[i] >
len2) {continue;}stepSort(stepArr[i]);}// 排序一個步長function stepSort(step) {//console.log(step) 使用的步長統(tǒng)計(jì)var i = 0
,j = 0
,f, tem, key;var stepLen = len % step > 0 ? parseInt(len / step) + 1 : len /
step;for (; i < step; i++) {
// 依次循環(huán)列for (j = 1
;/*j < stepLen && */step * j + i < len; j++) {
//依次循環(huán)每列的每行tem = f = step * j +
i;key =
array[f];while ((tem -= step) >= 0) {
// 依次向上查找if (array[tem] >
key) {array[tem + step] =
array[tem];} else {break;}}array[tem + step] =
key;}}}return array;} ?
轉(zhuǎn)載于:https://www.cnblogs.com/idche/archive/2011/02/16/1956397.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript版几种常见排序算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。