# 排序
# 前言
- 开发过程中如果遇到庞大数据体系,最优化排序将会使性能最大化
- 各种算法使用案例
- 了解内部原理
# 冒泡排序(Bubble Sort)
通过比较相邻元素的大小,每次将最大(或最小)的元素“冒泡”到数组的一端,然后再从数组的另一端开始,重复这个过程,直到整个数组都排序完成。
缺点
: 性能一般
var arr = [1, 5, 7, 9, 16, 2, 4];
//冒泡排序,每一趟找出最大的,总共比较次数为arr.length-1次,每次的比较次数为arr.length-1次,依次递减
function sortByBubbles(arr) {
var temp;
for (var i = 0; i < arr.length - 1; i++) {
for (var j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 选择排序(Selection Sort)
每次从未排序的元素中选出最小(或最大)的元素,将其放在已排序元素的末尾,然后重复这个过程,直到整个数组都排序完成。
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex !== i) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
}
return arr;
}
// 测试
let arr = [32, 15, 21, 23, 1, 0];
console.log(selectionSort(arr));
在这个示例中,selectionSort 函数接收一个数组作为参数,然后通过遍历数组,将当前元素与已排序的元素进行比较,将当前元素交换到未排序元素的末尾,从而实现排序。具体来说,它从第二个元素开始,遍历已排序的元素,将当前元素与已排序的元素进行比较,找到最小的元素,然后将其交换到未排序元素的末尾。最后,该函数返回已排序的数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 插入排序(Insertion Sort)
通过将未排序的元素一个一个插入到已排序的数组中,逐步缩小未排序元素的范围,直到整个数组都排序完成。
function insertionSort(arr) {
for (let i = 1; i < arr.length; i++) {
let current = arr[i];
let j = i - 1;
while (j >= 0 && arr[j] > current) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = current;
}
return arr;
}
// 测试
let arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
console.log(insertionSort(arr)); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
在这个示例中,insertionSort 函数接收一个数组作为参数,然后通过遍历数组,将当前元素插入到已排序的子数组中,从而实现排序。具体来说,它从第二个元素开始,将其与前面的元素进行比较,如果前面的元素比当前元素大,则将前面的元素向后移动一位,直到找到一个比当前元素小的位置,然后将当前元素插入到该位置。最后,该函数返回已排序的数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 快速排序(Quick Sort)
通过比较相邻元素的大小,选出最小(或最大)的元素,将其放在已排序元素的末尾,然后重复这个过程,直到整个数组都排序完成。
function quickSort(arr) {
if (arr.length <= 1) {
return arr;
}
var left = [];
var right = [];
var midIndex = parseInt(arr.length / 2);
var mid = arr[midIndex];
for (var i = 0; i < arr.length; i++) {
if (i == midIndex) continue;
if (arr[i] < mid) {
left.push(arr[i])
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([mid], quickSort(right));
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 希尔排序
function shellSort(arr) {
const n = arr.length;
let gap = Math.floor(n / 2);
while (gap > 0) {
for (let i = gap; i < n; i++) {
const temp = arr[i];
let j = i;
while (j >= gap && arr[j - gap] > temp) {
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = temp;
}
gap = Math.floor(gap / 2);
}
return arr;
}
// 测试
const arr = [52, 48, 32, 50, 17];
console.log(shellSort(arr)); // [17, 16, 19, 22, 32, 48, 52]
在这个示例中,shellSort 函数接收一个数组作为参数,然后通过希尔排序算法对数组进行排序。具体来说,它首先将数组分成若干个子序列,对每个子序列进行插入排序,然后缩小间隔直到间隔为 1,最后对整个数组进行插入排序。在插入排序过程中,使用了一个间隔 gap 来进行元素的比较和交换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 对象数组排序
//一维数组排序
function simpleSort(arr) {
var copyArr = JSON.parse(JSON.stringify(arr));
copyArr.sort(function (a, b) {
return b - a; //降序排列,return a-b; —>升序排列
})
return copyArr;
}
var deepArr = [
{ name: 'syy', age: 0 },
{ name: 'wxy', age: 18 },
{ name: 'slj', age: 8 },
{ name: 'wj', age: 20 }
];
//对象数组排序
function deepBySort(arr, key) {
var copyArr = JSON.parse(JSON.stringify(arr));
copyArr.sort(function (a, b) {
var value1 = a[key];
var value2 = b[key];
return value1 - value2;//升序,降序为value2 - value1
});
return copyArr;
}
var sortArr1 = deepBySort(deepArr, 'age');
console.log(sortArr1, '=====sortArr1')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 总结
以上是一些常见的 JavaScript 排序算法,实际上还有很多其他的排序算法,可以根据具体的需求选择合适的算法。还有如归并排序(Merge Sort)、堆排序(Heap Sort)、计数排序(Counting Sort)、基数排序(Radix Sort)等算法
← 扁平化与树形结构互转 大文件上传 →