冒泡排序
动图演示:
代码:
const arrar = [3,4,5,6,1,2,3,8,8,8,9,0,123,44,2,66,99,22,4];
function bubbleSort (arr) {
let arrLength = arr.length - 1;
while(arrLength) {
for(let i = 0; i < arrLength; i++) {
if(arr[i] > arr[i + 1]) {
const value = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = value;
}
}
arrLength -= 1;
}
return arr;
}
console.log(bubbleSort(arrar))
选择排序
动图演示:
代码:
const arrar = [3,4,5,6,1,2,3,8,8,8,9,0,123,44,2,66,99,22,4];
function selectionSort (arr) {
let arrLength = arr.length - 1;
let startIndex = 0;
while(startIndex <= arrLength) {
let contrastIndex = startIndex;
for(let i = startIndex; i <= arrLength; i ++) {
if(arr[contrastIndex] > arr[i]) {
contrastIndex = i;
}
}
const value = arr[startIndex];
arr[startIndex] = arr[contrastIndex];
arr[contrastIndex] = value;
startIndex += 1;
}
return arr;
};
console.log(selectionSort(arrar));
插入排序
动图演示:
代码
const arrar = [3,4,5,6,1,2,3,8,8,8,9,0,123,44,2,66,99,22,4];
function insertionSort(array) {
for (let i = 1; i < array.length; i++) {
let key = array[i];
let j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return array;
}
console.log(insertionSort(arrar));
希尔排序
动图演示:
代码:
const arrar = [3,4,5,6,1,2,3,8,8,8,9,0,123,44,2,66,99,22,4];
function shellSort(arr){
//第一趟循环,确定增量
for(let gap = parseInt(arr.length/2); gap > 0; gap = parseInt(gap/2)){
//第二层循环,找到每个块对应的序列
console.log(88888, gap)
for(let i = gap; i < arr.length; i ++){
let j = i;
let empty = arr[j]
//使用插入排序对对应的序列进行排序
while(j - gap >=0 && empty < arr[j - gap]){
arr[j] = arr[j-gap];
j -= gap;
}
arr[j] = empty;
}
}
return arr;
};
console.log(shellSort(arrar));
归并排序
动图演示:
代码:
const arrar = [3,4,5,6,1,2,3,8,8,8,9,0,123,44,2,66,99,22,4];
function mergeSort(arr) {
const arrLength = arr.length;
if (arrLength <= 1) return arr;
const num = Math.floor(arrLength / 2);
const leftArr = mergeSort(arr.slice(0, num));
const rightArr = mergeSort(arr.slice(num, arrLength));
return merge(leftArr, rightArr);
}
function merge(leftArr, rightArr) {
let newArray = [];
let [leftStart, rightStart] = [0, 0];
while(leftStart < leftArr.length && rightStart < rightArr.length) {
if (leftArr[leftStart] < rightArr[rightStart]) {
newArray.push(leftArr[leftStart]);
leftStart ++;
} else {
newArray.push(rightArr[rightStart]);
rightStart ++;
}
}
newArray = newArray.concat(leftArr.slice(leftStart, leftArr.length));
newArray = newArray.concat(rightArr.slice(rightStart, rightArr.length));
return newArray;
}
const arr = mergeSort(arrar);
console.log(arr);
快速排序
实现思路:
- 找出基线值,一般可以取中间数,(随意)
- 整体分为三块,left: 比中间数小的, base:中间数, right: 比中间数大的
- 利用递归组合出排序后的数组
代码:
// 快排
function quickSort(arr) {
// 停止条件
if (arr.length <= 1) return arr;
// 确定锚点元素
const index = parseInt(arr.length / 2);
const flagValue = arr[index];
const leftArr = [];
const rightArr = [];
// 获取左右子集合
for (let i = 0; i < arr.length; i++) {
const item = arr[i];
if (i === index) continue;
if (item <= flagValue) leftArr.push(item);
else rightArr.push(item);
}
// 递归查询子集合
return [...quickSort(leftArr), flagValue, ...quickSort(rightArr)];
}
计数排序
动图演示:
提示:这里可以添加学习目标
基数排序
动图演示:
提示:这里可以添加学习目标
桶排序
动图演示:
提示:这里可以添加学习目标