電腦配置
cpu:amd x4 640
記憶體: 巨集想 ddr3 1600mhz 8g
主機板:華擎 980de3/u3s3 r2.0
瀏覽器:chrome 79.0.3945.88(正式版本) (64 位)
時間測試函式
function testruntime(fn)
1.氣泡排序
2.選擇排序
3.插入排序
4.希爾排序
5.歸併排序
6.快速排序
7.計數排序
8.堆排序
9.二分法排序 每插入乙個新元素,就對其進行排序
排序思想:判斷兩個相鄰元素,大於則交換位置
複雜度:o(n^2)
例子:[2 4 5 3 1] > [2 4 3 1 5] > [2 3 1 4 5] > 2 1 3 4 5] > [1 2 3 4 5]
排序思想: 每次判斷,拿到最小值,交換位置// 氣泡排序
function bubblesort(arr) }}
return arr;
}
複雜度:o(n^2)
例子:[2 4 5 3 1] > [1 3 5 3 2] > [1 2 5 3 4] > [1 2 3 5 4] > [1 2 3 4 5]
適用與規模小、有序的資料3w-// 選擇排序
function selectionsort(arr)
}// 進行互換位置
temp = arr[minindex];
arr[minindex] = arr[i];
arr[i] = temp;
}return arr;
}
排序思想:將陣列分成兩個,乙個是已排序好的,乙個是待排序的,將待排序的元素和已排序好的元素進行比較,插入適當位置。
複雜度:o(n^2) 有序程度越高,越快
例子:[2] [4 5 3 1] > [2 4] [5 3 1] > [2 4 5] [3 1] > [2 3 4 5] [1] > [1 2 3 4 5]
適用於中等規模的資料10萬+// 插入排序
function insertionsort(arr)
arr[prev+1] = cur;
}return arr;
}
排序思想:將陣列拆分成不同的間隔,對每個間隔進行插入排序,最後將全部進行一次插入排序
複雜度:o(n^1.5) 有序程度越高,越快
排序思想:將陣列拆分成最小單元,進行比較插入let len = arr.length;
let h = math.floor(len/2);
// while (h < len / 3) ;
while (h >= 1)
}h = math.round(h / 3);
}return arr;
複雜度:o(nlogn)
例子:[ 2 4 5 3 1] > [2] [4] [5] [3] [1] > [2 4] [5] [3] [1] > [2 4 5] [3] [1] > [2 3 4 5] [1] > [1 2 3 4 5]。從左往右比較合併
排序思想:取乙個基準值,比基準值小的在左邊,大的在右邊;左右在繼續這樣的操作,最後合併。// 歸併排序
function mergesort(arr)
let middle = math.floor(arr.length/2);
let left = arr.slice(0, middle);
let right = arr.slice(middle);
return merge(mergesort(left), mergesort(right));
}function merge(left, right) else
}// 不管新增哪個,留下來的就是最大的
while (left.length)
while (right.length)
return result;
}
複雜度:o(nlogn)
例子:[ 2 4 3 5 1 ] > [ 2 1]+[ 3 ]+[ 4 5 ] > [ 1 ]+[ 2 ]+[ 3 ]+[ 4 ]+[ 5 ]
排序思想:將陣列的值當另乙個陣列的索引,再取出來。典型的空間換時間。// 快速排序
function quicksort (arr)
let pivotindex = math.floor(arr.length/2);
let pivot = arr.splice(pivotindex,1)[0]; // 基準值
let left = , // 存放比基準值小的
right = ; // 存放比基準值大的
arr.foreach(item=> else
})return quicksort(left).concat([pivot], quicksort(right));
}
複雜度:o(n+m) m為元素最大值
例子:
排序思想:先構建乙個最大堆,然後迴圈陣列,依次將最大的元素放到末尾function countingsort(arr)
bucket[arr[i]]++;
}for (let i = 0,len=bucket.length; i < len; i++)
}return arr;
}
複雜度:o(nlogn)
排序思想:插入元素時進行排序,因為之前的元素是有序的,所以可以使用二分法,到最後,小於中間值的插入中間值前面,大於或等於中間值的插入後面function heapsort(arr)
if (right < len && arr[right] > arr[largest])
if (largest != i)
}function swap(i, j)
// 構建堆
for (let i = math.floor(len/2) - 1; i >= 0; i--)
// 大-> 小
for (let i = arr.length - 1; i > 0; i--)
/* 小->大
for (let i = 0; i < len; i++)
*/return arr;
}
複雜度:nlog2^n
function binarysort(arr, val) else if (arr[middle] < val)
middle = math.floor(begin + (end - begin) / 2);
}if (arr[middle] > val) else
return arr;
}testruntime(() => ;
});
常見排序演算法 JS實現
氣泡排序 bubblesort 每輪排序選出乙個最小或最大的元素再乙個個插入陣列 選擇排序 selectionsort this swap min,i 從未排序元素中挑出乙個元素挨個跟區域性有序的元素進行比較,找到對應位置插入即可 插入排序 insertsort this array j temp ...
js實現常見的排序演算法
插入排序的實現 function insertsort2 arr arr j 1 temp 插入排序改進,判斷j 0 function insertsort2 arr arr j 1 temp 希爾排序 分割策略 縮小增量排序 折半插入 function shellsort arr arr k ga...
常見的排序演算法 JS實現
一 氣泡排序 1 function bubblesort arr 10 11 i 12 13return arr 14 二 快速排序 1 function quicksort array 6var key arr right 7var i left,j right 8while i 12 arr j...