冒泡
從前向后遍歷,如果前面的元素大于后面的,兩者互換位置
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var arr = [2,43,4545,22,4,567,56,76]
function bubble (arr) {
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i+1; j < arr.length; j++) {
if(arr[j]< arr[i]) {
let tem = arr[i]
arr[i] = arr[j]
arr[j] = tem
}
}
}
return arr
}
console.log(bubble(arr))
</script>
</body>
</html>
選擇排序
從未排序的數(shù)組中遍歷出最小的元素,和開始位置的元素互換位置
繼續(xù)從剩下的元素中遍歷出做小的,放在已排序的元素后面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var arr = [2,43,4545,22,4,567,56,76]
function selectSort (arr) {
let min = 0
for (let i = 0; i < arr.length; i++) {
min = i
for (let j =i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j
}
}
let tem = arr[i]
arr[i] = arr[min]
arr[min] = tem
}
return arr
}
console.log(selectSort(arr))
</script>
</body>
</html>
歸并排序
mergeSort
用于分割數(shù)組,直到分割成單個元素,然后會調(diào)用merge
merge
作用 排序已經(jīng)分割的元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
// 遞歸調(diào)用mergeSort函數(shù),
// 遞歸至數(shù)組長度為1時,合并leftArr rightArr數(shù)組
var arr = [2,43,4545,22,4,567,56,76]
function mergeSort (arr) {
let length = arr.length
if (length < 2) {
return arr
}
let middle = Math.floor(length/2)
let leftArr = arr.slice(0, middle)
let rightArr = arr.slice(middle)
return merge(mergeSort(leftArr), mergeSort(rightArr))
}
function merge (leftArr, rightArr) {
let result = []
while (leftArr.length && rightArr.length) {
if (leftArr[0] <= rightArr[0]) {
result.push(leftArr.shift())
}else {
result.push(rightArr.shift())
}
}
while (leftArr.length) {
result.push(leftArr.shift())
}
while (rightArr.length) {
result.push(rightArr.shift())
}
return result
}
console.log(mergeSort(arr))
</script>
</body>
</html>
插入排序
當(dāng)前元素current
如果小于前一位元素,前一位元素
的索引加1
直到 當(dāng)前元素current
大于正在比較的元素時,跳出while
循環(huán)
當(dāng)前元素current
位置更改為正在比較的元素
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
var arr = [2,43,4545,22,4,567,56,76]
function insert (arr) {
let current, preIndex
for (let i = 1; i < arr.length; i++) {
current = arr[i]
preIndex = i - 1
// 首先緩存當(dāng)前的current 和 index,在while循環(huán)中會發(fā)生變化
// 循環(huán)直到當(dāng)前的數(shù)組元素大于current時候停止,再賦值與index+1位的元素
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = current
}
return arr
}
console.log(insert(arr))
</script>
</body>
</html>
希爾排序
選擇一個增量序列,按增量序列對序列進(jìn)行排序
每趟排序的方法為插入排序
,根據(jù)對應(yīng)的增量 ,分為多次排序
直到趟數(shù)為1
時,完成排序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
// 參考資料 https://blog.csdn.net/weixin_37818081/article/details/79202115
// 希爾排序 (多個小的組別插入排序逐漸歸為一個組別的插入方法)
var arr = [22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1]
function shellSort(arr) {
var len = arr.length,
temp,
gap = 1;
while(gap < len/3) { //動態(tài)定義間隔序列
gap =gap*3+1;
}
// for 循環(huán) 順序 1,gap ==> 2,gap > 0 ==> 3,console.log('for1', gap) ==> 4,gap = Math.floor(gap/3) ==> 2,gap > 0
for (gap; gap > 0; gap = Math.floor(gap/3)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j >= 0 && arr[j] > temp; j-=gap) { // 插入排序
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
return arr;
}
console.log(shellSort(arr))
</script>
</body>
</html>