常见算法

1.选择排序

思路如下:

  • 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  • 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕
function selectionSort(arr) {
    var len = arr.length;
    var minIndex, temp;
    
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}
 
// 示例使用
var arr = [64, 25, 12, 22, 11];
console.log('Before sort: ', arr); // [64, 25, 12, 22, 11]
console.log('After sort: ', selectionSort(arr)); // [11, 12, 22, 25, 64]

2.冒泡排序

思路如下:

  • 比较相邻的元素,如果第一个比第二个大,就交换它们两个

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数

  • 针对所有的元素重复以上的步骤,除了最后一个

  • 重复上述步骤,直到没有任何一堆数字需要比较

function bubbleSort(arr) {
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {        // 相邻元素两两对比
                var temp = arr[j + 1];        // 元素交换
                arr[j + 1] = arr[j];
                arr[j] = temp;
            }
        }
    }
    return arr;
}
 
// 示例使用
var arr = [64, 33, 24, 10, 100, 50];
console.log('原始数组: ' + arr);
var sortedArr = bubbleSort(arr);
console.log('排序后数组: ' + sortedArr);

3.插入排序

思路如下:

  • 把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的
  • 从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
  • 重复上述过程直到最后一个元素被插入有序子数组中
function insertionSort(arr) {
    for (let i = 1; i < arr.length; i++) {
        let key = arr[i];
        let j = i - 1;
 
        // 移动元素并查找插入点
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
    return arr;
}
 
// 示例使用
const arr = [10, 2, 9, 3, 8, 4, 7, 5, 6];
const sortedArr = insertionSort(arr);
console.log(sortedArr); // 输出: [2, 3, 4, 5, 6, 7, 8, 9, 10]

4.归并排序

思路如下:

  • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  • 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  • 重复步骤3直到某一指针到达序列尾
  • 将另一序列剩下的所有元素直接复制到合并序列尾
function mergeSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
 
    const middle = Math.floor(arr.length / 2);
    const left = arr.slice(0, middle);
    const right = arr.slice(middle);
 
    return merge(mergeSort(left), mergeSort(right));
}
 
function merge(left, right) {
    let result = [];
    while (left.length && right.length) {
        if (left[0] <= right[0]) {
            result.push(left.shift());
        } else {
            result.push(right.shift());
        }
    }
    while (left.length)
        result.push(left.shift());
    while (right.length)
        result.push(right.shift());
    return result;
}
 
// 使用示例
const unsortedArray = [4, 3, 2, 10, 12, 1, 5, 6];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray);  // 输出: [1, 2, 3, 4, 5, 6, 10, 12]

5.快速排序

思路如下:

  • 从数列中挑出一个元素,称为"基准"(pivot)
  • 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
  • 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序
function quickSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
 
    const pivotIndex = Math.floor(arr.length / 2);
    const pivot = arr.splice(pivotIndex, 1)[0];
    const left = [];
    const right = [];
 
    for (let i = 0; i < arr.length; i++) {
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }
 
    return quickSort(left).concat([pivot], quickSort(right));
}
 
// 使用示例
const arr = [3, 6, 8, 10, 1, 2, 1, 4, 7, 9];
console.log(quickSort(arr)); // 输出: [1, 1, 2, 3, 4, 6, 7, 8, 9, 10]

总结:

 

posted on 2024-08-12 02:07  W-阿飞  阅读(5)  评论(0编辑  收藏  举报