返回

揭秘常见排序算法:分治、交换、比较、插入

闲谈

分治算法:快速排序

快速排序是一种高效的分治算法,它利用递归的思想将待排序序列不断分割成更小的子序列,直到每个子序列只有一个元素。在此过程中,算法会选择一个枢轴元素,然后将所有小于枢轴元素的元素放在枢轴元素的左边,所有大于枢轴元素的元素放在枢轴元素的右边。最终,当所有元素都被排序好后,算法将停止。快速排序的时间复杂度为O(nlogn),空间复杂度为O(logn)。

交换算法:冒泡排序

冒泡排序是一种简单的交换算法,它通过不断比较相邻元素的大小,将较大的元素“冒泡”到序列的末尾。在每趟排序中,算法会遍历整个序列,比较相邻元素的大小,如果前一个元素大于后一个元素,则将它们交换位置。经过多次遍历后,所有元素都会被排序好。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1)。

比较算法:选择排序

选择排序是一种简单的比较算法,它通过不断选择序列中最小(或最大)的元素,并将其交换到序列的开头(或结尾)。在每趟排序中,算法会遍历整个序列,找到最小(或最大)的元素,然后将其与序列的第一个(或最后一个)元素交换位置。经过多次遍历后,所有元素都会被排序好。选择排序的时间复杂度为O(n^2),空间复杂度为O(1)。

插入算法:插入排序

插入排序是一种简单的插入算法,它通过不断将一个元素插入到已经排序好的序列中,来实现排序。在每趟排序中,算法会从第二个元素开始,将其与前面已经排序好的元素比较,如果当前元素小于前面的元素,则将其插入到前面元素的前面。经过多次遍历后,所有元素都会被排序好。插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。

算法比较

排序算法的选择取决于数据量大小、数据分布和所需的排序速度等因素。快速排序通常是最快的排序算法之一,但它对数据分布比较敏感,当数据分布不均匀时,它的效率会降低。冒泡排序和选择排序都是简单的排序算法,它们很容易理解和实现,但它们的时间复杂度较高。插入排序对于小数据量或者已经基本有序的数据非常高效。

编程实现

// 快速排序
function quickSort(array) {
  if (array.length <= 1) {
    return array;
  }
  const pivot = array[Math.floor(array.length / 2)];
  const left = [];
  const right = [];
  for (let i = 0; i < array.length; i++) {
    if (array[i] < pivot) {
      left.push(array[i]);
    } else if (array[i] > pivot) {
      right.push(array[i]);
    }
  }
  return quickSort(left).concat(pivot, quickSort(right));
}

// 冒泡排序
function bubbleSort(array) {
  for (let i = 0; i < array.length - 1; i++) {
    for (let j = 0; j < array.length - i - 1; j++) {
      if (array[j] > array[j + 1]) {
        const temp = array[j];
        array[j] = array[j + 1];
        array[j + 1] = temp;
      }
    }
  }
  return array;
}

// 选择排序
function selectionSort(array) {
  for (let i = 0; i < array.length - 1; i++) {
    let minIndex = i;
    for (let j = i + 1; j < array.length; j++) {
      if (array[j] < array[minIndex]) {
        minIndex = j;
      }
    }
    const temp = array[i];
    array[i] = array[minIndex];
    array[minIndex] = temp;
  }
  return array;
}

// 插入排序
function insertionSort(array) {
  for (let i = 1; i < array.length; i++) {
    const current = array[i];
    let j = i - 1;
    while (j >= 0 && array[j] > current) {
      array[j + 1] = array[j];
      j--;
    }
    array[j + 1] = current;
  }
  return array;
}

总结

排序算法是计算机科学领域的重要组成部分,它们广泛应用于各种编程场景中。本文介绍了四种常见的排序算法:快速排序、冒泡排序、选择排序和插入排序。这些算法各有优缺点,选择合适的算法取决于数据量大小、数据分布和所需的排序速度等因素。