冒泡排序
描述:
一次比较相邻的两个元素,如果它们顺序错误就交换位置;每次循环后最后的元素会是我们期待的数(最大或最小);针对所有元素重复以上步骤,除了第一个。直到两层循环全部执行完毕,排序完成。
时间复杂度:O(n²)
空间复杂度:O(1)
代码实现:
1 2 3 4 5 6 7 8 9 10 11
| function bubbleSort(arr) { const len = arr.length; for (let i = 0; i < len; i++) { for (let j = 0; j < len - 1 - i; j++) { if (arr[j] > arr[j + 1]) { arr[j] = [arr[j + 1], arr[j + 1] = arr[j]][0]; } } } return arr; }
|
选择排序
描述:
首先在未排序队列中找出最大(小)的元素,存放到已排序队列中的起始位置;然后再从剩余未排序队列中继续找出最大(小)的元素,存放到已排序队列的末尾;以此类推,直到排序完毕。
时间复杂度:O(n²)
空间复杂度:O(1)
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function selectionSort(arr) { const len = arr.length; let minIndex; for (let i = 0; i < len - 1; i++) { minIndex = i; for (let j = i + 1; j < len; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } arr[i] = [arr[minIndex], arr[minIndex] = arr[i]][0]; } return arr; }
|
插入排序
描述:
将第一个元素看做已排序队列,剩余元素为未排序队列;从未排序队列取出一个元素,在已排序队列从后向前扫描,若该元素(已排序)大(小)于新元素(未排序队列取出的),则将该元素移到下一位置;直到该元素小(大)于或者等于新元素,将新元素插入到位置。重复以上步骤直到所有元素排序完成。
时间复杂度:O(n²)
空间复杂度:O(1)
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function insertSort(arr) { const len = arr.length; let preIndex, current; for (let i = 1; i < len; i++) { preIndex = i - 1; current = arr[i]; while(preIndex >= 0 && arr[preIndex] > current) { arr[preIndex + 1] = arr[preIndex]; preIndex--; } arr[preIndex + 1] = current; } return arr; }
|
快速排序
描述:
选择一个合适的元素a(一般是第一个元素)作为排序基准,将未排序队列中比a小和比a大的分别放在两侧,将两侧的子数组重复以上步骤(递归),直到最后只剩下一个元素(递归出口),排序完成。
时间复杂度:O(n㏒₂n)
空间复杂度:O(n㏒₂n)
代码实现:
1 2 3 4 5 6 7 8 9 10 11
| function quickSort(arr) { if (arr.length <= 1) return arr; let number = arr[0]; let left = [], right = []; for (let i = 1; i < arr.length; i++) { arr[i] <= number ? left.push(arr[i]) : right.push(arr[i]); } return quickSort(left).concat([number], quickSort(right)); }
|