js實現常見排序演算法

2022-03-31 12:42:52 字數 4066 閱讀 1611

電腦配置

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]

// 選擇排序

function selectionsort(arr)

}// 進行互換位置

temp = arr[minindex];

arr[minindex] = arr[i];

arr[i] = temp;

}return arr;

}

適用與規模小、有序的資料3w-

排序思想:將陣列分成兩個,乙個是已排序好的,乙個是待排序的,將待排序的元素和已排序好的元素進行比較,插入適當位置。

複雜度: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]

// 插入排序

function insertionsort(arr)

arr[prev+1] = cur;

}return arr;

}

適用於中等規模的資料10萬+

排序思想:將陣列拆分成不同的間隔,對每個間隔進行插入排序,最後將全部進行一次插入排序

複雜度: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...