冒泡排序
-
时间复杂度:
- 最差情况:T(n)=O(n^2)
- 最佳情况:T(n)=O(n)
- 平均情况:T(n)=O(n^2)
- 思路总结:两两对比,遇到不合符条件的立马换位置。
-
代码展示:
bubbleMinToMax(arr = []) { if (!utils.isArray(arr)) return []; let loopStart = 0, loopEnd = arr.length - 1; let lastChangeIndex = 0; while (loopStart < loopEnd) { // 正向循环找最大值 for (let i = loopStart; i < loopEnd; i++) { if (arr[i] > arr[i + 1]) { lastChangeIndex = i; arr[i] ^= arr[i + 1]; arr[i + 1] ^= arr[i]; arr[i] ^= arr[i + 1]; } } loopEnd = lastChangeIndex; // 反向循环找最小值 for (let j = loopEnd; j > loopStart; j--) { if (arr[j - 1] > arr[j]) { lastChangeIndex = j; arr[j] ^= arr[j - 1]; arr[j - 1] ^= arr[j]; arr[j] ^= arr[j - 1]; } } loopStart = lastChangeIndex; } return arr;
选择排序
-
时间复杂度:
- 最差情况:T(n)=O(n^2)
- 最佳情况:T(n)=O(n^2)
- 平均情况:T(n)=O(n^2)
- 思路总结:两两对比,记录最小值/最大值下标,循环完一次后,再替换当前下标的值。
- 代码展示:
selectionSort(arr = []) {
if (!utils.isArray(arr)) return [];
let minIndex;
for (let i = 0; i < arr.length - 1; i++) {
minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j;
}
}
if (i === minIndex) continue;
arr[i] ^= arr[minIndex];
arr[minIndex] ^= arr[i];
arr[i] ^= arr[minIndex];
}
return arr;
}
插入排序
-
时间复杂度:
- 最差情况:T(n)=O(n^2)
- 最佳情况:T(n)=O(n)
- 平均情况:T(n)=O(n^2)
-
思路总结:
- 默认第一位为已被排好序的数据。
- 取已被排好序的下一个元素(假设名为a),并用变量(假设名为insertData)记录a的值,将a的值与已被排好序的数据一一对比(从该位置往前)
- 如果有已排序中的元素大于新元素(a)则将已排序的元素向后移动一位,反之则将a插入到该元素之后。
- 代码展示:
// 查找插入位置使用二分查找法:二分查找法只适用于有序数据
binaryInsertionSort(arr = []) {
if (!utils.isArray(arr)) return [];
for (let i = 1; i < arr.length; i++) {
let key = arr[i], left = 0, right = i - 1;
while (left <= right) {
let middle = parseInt((left + right) / 2);
if (arr[middle] >= key) {
right = middle - 1;
} else {
left = middle + 1;
}
}
for (let j = i - 1; j >= left; j--) {
arr[j + 1] = arr[j];
}
arr[left] = key;
}
return arr;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。