Skip to content

Commit 32fa47f

Browse files
sort
1 parent 1c76c00 commit 32fa47f

File tree

4 files changed

+140
-0
lines changed

4 files changed

+140
-0
lines changed

Note/sort/bubbleSort.js

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
function bubbleSort(nums) {
2+
if (!nums || nums.length <= 1) return nums;
3+
4+
for(let i=0; i<nums.length-1; i++) {
5+
let sorted = true;
6+
for(let j=0; j<nums.length-1-i; j++) {
7+
if(nums[j]>nums[j+1]) {
8+
[nums[j], nums[j+1]] = [nums[j+1], nums[j]];
9+
sorted = false; // 若一轮循环没有可交换元素, 即数组已有序, 则不需要后续遍历了
10+
}
11+
}
12+
if (sorted) break;
13+
}
14+
return nums;
15+
}
16+
17+
18+
module.exports = bubbleSort;

Note/sort/index.js

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const bubbleSort = require('./bubbleSort.js');
2+
const selectSort = require('./selectSort.js');
3+
4+
5+
function randomNums(len=1, min=0, max=1) {
6+
let nums = [];
7+
while(len--) nums.push(Math.floor(Math.random() * max + min));
8+
return nums;
9+
}
10+
let nums = randomNums(10, 0, 100);
11+
console.log(nums);
12+
13+
// 测试代码
14+
console.log(bubbleSort([...nums]));
15+
console.log(selectSort([...nums]));

Note/sort/selectSort.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function selectSort(nums) {
2+
if (!nums || nums.length <=1) return nums;
3+
4+
for(let i=0; i<nums.length; i++) {
5+
for(let j=i; j<nums.length; j++) {
6+
if (nums[i] > nums[j]) [nums[i], nums[j]] = [nums[j], nums[i]];
7+
}
8+
}
9+
return nums;
10+
}
11+
12+
module.exports = selectSort;

Note/sort/sort.md

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
## 排序算法
2+
3+
### 概述
4+
排序是程序中最基本的操作,不同的排序所消耗的时间空间不同,此处实现了十种排序算法,做下笔记。
5+
6+
### 实现
7+
以下代码均以升序排列数组,如需降序,通常只需要在判断条件处处理即可
8+
9+
#### 冒泡排序
10+
11+
* 基本思想是
12+
* 每次对比相邻的两个元素,将大的放到后面,一轮循环后则最大元素就处于正确的位置了
13+
* 外层循环,依次得到最大值,第二大, ..., 最小值
14+
* 示例代码
15+
16+
```js
17+
function bubbleSort(nums) {
18+
if (!nums || nums.length <= 1) return nums;
19+
20+
for(let i=0; i<nums.length-1; i++) {
21+
let sorted = true;
22+
for(let j=0; j<nums.length-1-i; j++) {
23+
if(nums[j]>nums[j+1]) {
24+
[nums[j], nums[j+1]] = [nums[j+1], nums[j]];
25+
sorted = false; // 若一轮循环没有可交换元素, 即数组已有序, 则不需要后续遍历了
26+
}
27+
}
28+
if (sorted) break;
29+
}
30+
return nums;
31+
}
32+
```
33+
* 代码分析
34+
* 空间复杂度: 没有使用额外空间,空间复杂度为 O(1)
35+
* 时间复杂度
36+
* 最好:数组已有序,一轮遍历后停止,O(n)
37+
* 最坏:需计算 n! 次,根据等差数列求和公式,为 O(n<sup>2</sup>)
38+
* 平均:O(n<sup>2</sup>)
39+
40+
#### 选择排序
41+
* 基本思想
42+
* 选择排序则是选择第 0 位元素作为最小值
43+
* 将其后元素分别与第 0 位元素比较,若比其小,则交换
44+
* 如此一来,一轮循环结束,则第 0 位则是数组中最小的元素
45+
* 外层循环,分别选择第 0,1 ..., 直至最后一位
46+
* 示例代码
47+
48+
```js
49+
function selectSort(nums) {
50+
if (!nums || nums.length <=1) return nums;
51+
52+
for(let i=0; i<nums.length; i++) {
53+
for(let j=i; j<nums.length; j++) {
54+
if (nums[i] > nums[j]) [nums[i], nums[j]] = [nums[j], nums[i]];
55+
}
56+
}
57+
return nums;
58+
}
59+
```
60+
* 代码分析
61+
* 空间复杂度:未使用额外空间,空间复杂度为 O(1)
62+
* 时间复杂度:由于无法判断后续元素是否有序,故最好,最坏,平均时间复杂度均为 O(n<sup>2</sup>)
63+
64+
#### 插入排序
65+
* 基本思想
66+
* 插入排序则是假设数组前 i 个元素有序,i 初始值为 1
67+
* 从第 i+1 个元素开始,去前 i 个元素进行遍历,找到一个比 i+1 对应元素小的位置 j
68+
* 将第 i+1 个元素插入到 j 的后面,依次插入完毕后,数组有序
69+
* 示例代码
70+
71+
```js
72+
```
73+
74+
#### 快速排序
75+
76+
#### 归并排序
77+
78+
#### 计数排序
79+
80+
#### 基数排序
81+
82+
#### 桶排序
83+
84+
#### 希尔排序
85+
86+
#### 堆排序
87+
88+
89+
### 排序算法对比
90+
91+
92+
### 参考资料
93+
* [LeetCode 题解](https://leetcode-cn.com/problems/sort-an-array/)
94+
* [十大排序 js 实现](https://github.com/DangoSky/algorithm/tree/master/Algorithm-notes)
95+
* [visualgo 算法可视化](https://visualgo.net/en/sorting)

0 commit comments

Comments
 (0)