排序算法
本文最后更新于:7 个月前
//插入排序
function insertSort(arr) {
for (let i = 0; i < arr.length; i++) {
//在前面已经排序好的位置里找到当前元素应该插入的位置
for (let j = 0; j < i; j++) {
if (arr[i] <= arr[j]) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
//希尔排序
function shellSort(array) {
if (array.length <= 1) return array; // 如果数组长度为1,直接返回
var gap = Math.floor(array.length / 2);
while (gap > 0) {
for (var i = gap; i < array.length; i++) {
var j = i;
var temp = array[j];
while (j > 0 && array[j - gap] > temp) {
// 若array[j - gap]>temp(即array[j]) 则互换位置
array[j] = array[j - gap]; // 这里可看成是将 j-gap 后移一个 gap 位 //TODO 插入排序这里是后移一位
array[j - gap] = temp; // 由于不像插入排序那样需要比较很多个元素,而是两个数的比较,此处将大得值往前移一个 gap 位即可
j -= gap; // 跳出循环的条件
}
}
gap = Math.floor(gap / 2); // 减小增量
}
return array;
}
//选择排序
function chooseSort(arr) {
for (let i = 0; i < arr.length; i++) {
//在剩下的位置找最小的然后替换到当前位置
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[i]) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
//冒泡排序
function bubbleSort(arr) {
for (let i = 1; i < arr.length; i++) {
//从0开始对比相邻位置的大小,大的冒泡上去
for (let j = 0; j < arr.length - i; j++) {
if (arr[j + 1] < arr[j]) {
let temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
//归并排序
function mergeSort(arr, start, end) {
if (start < end) {
let mid = ((start + end) / 2) >> 0;
//分治左右处理
arr = mergeSort(arr, start, mid);
arr = mergeSort(arr, mid + 1, end);
//这里对一边的数组进行操作,经过上面的操作,这里的数组两边都是有序的
let left = start,
right = mid + 1,
tempArr = [];
//数组两边进行归并
while (left <= mid && right <= end) {
if (arr[left] < arr[right]) {
tempArr.push(arr[left++]);
} else {
tempArr.push(arr[right++]);
}
}
//哪边多出来了就拿出来合并
left > mid
? tempArr.push(...arr.slice(right, end + 1))
: tempArr.push(...arr.slice(left, mid + 1));
//把排好序的替换掉之前的
arr.splice(start, end - start + 1, ...tempArr);
}
return arr;
}
//快速排序
function quickSort(arr, start, end) {
if (start < end) {
let left = start,
right = end;
let temp = arr[left];
//左右分别找,大的放左边,小的放右边
while (left < right) {
while (arr[right] >= temp && left < right) {
right--;
}
arr[left] = arr[right];
while (arr[left] <= temp && left < right) {
left++;
}
arr[right] = arr[left];
}
arr[left] = temp;
//分治,左右的递归继续操作
arr = quickSort(arr, start, left - 1);
arr = quickSort(arr, left + 1, end);
}
return arr;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!