返回

排序算法对比,程序员必修课!

Android




面试必备

纵观编程历史的长河,排序算法作为最为古老和经典的算法之一,可谓是程序员的必修课。尤其是面试中,算法面试题常常围绕排序展开,掌握各种排序算法的优缺点,无疑有助于你在面试中脱颖而出。

三种常见排序算法

在排序算法的大家族中,冒泡排序、选择排序和插入排序可谓是三兄弟,在算法面试中占据着重要的位置。

1. 冒泡排序

冒泡排序算法基于这样的思路:对相邻的两个元素进行比较,如果顺序不正确,则交换他们,重复这个过程直到没有元素需要交换。
这种算法之所以被称为冒泡排序,是因为较小的元素会在比较中不断交换,最终浮到列表的顶部,如同气泡在液体中上升一样。

def bubble_sort(array):
  """冒泡排序"""
  for i in range(len(array) - 1):
    for j in range(len(array) - i - 1):
      if array[j] > array[j + 1]:
        array[j], array[j + 1] = array[j + 1], array[j]
  • 优点: 冒泡排序是一种简单易懂的算法,即使是编程新手也可以轻松理解和实现。
  • 缺点: 冒泡排序算法效率低下,时间复杂度为O(n^2),在处理大型数据集时会非常耗时。

2. 选择排序

选择排序算法基于这样的思路:每次找到数组中最小的元素,然后将其与第一个元素交换。接着,在剩下的元素中继续寻找最小的元素,并将其与第二个元素交换,以此类推,直到所有元素都排序完毕。

def selection_sort(array):
  """选择排序"""
  for i in range(len(array)):
    min_index = i
    for j in range(i + 1, len(array)):
      if array[j] < array[min_index]:
        min_index = j
    array[i], array[min_index] = array[min_index], array[i]
  • 优点: 选择排序算法比冒泡排序算法效率更高,时间复杂度为O(n^2),但仍然比较耗时。
  • 缺点: 选择排序算法不稳定,这意味着它可能会改变相等元素的顺序。

3. 插入排序

插入排序算法基于这样的思路:将一个无序的数组视为有序和无序两部分,初始状态下有序部分只有一个元素,无序部分包含所有其他元素。然后,每次从无序部分取出一个元素,将其插入到有序部分的正确位置,直到所有元素都排序完毕。

def insertion_sort(array):
  """插入排序"""
  for i in range(1, len(array)):
    key = array[i]
    j = i - 1
    while j >= 0 and key < array[j]:
      array[j + 1] = array[j]
      j -= 1
    array[j + 1] = key
  • 优点: 插入排序算法比冒泡排序和选择排序算法效率更高,时间复杂度为O(n^2),并且是稳定的。
  • 缺点: 插入排序算法在处理大型数据集时仍然比较耗时。

算法性能比较

算法 时间复杂度 空间复杂度 稳定性
冒泡排序 O(n^2) O(1) 不稳定
选择排序 O(n^2) O(1) 不稳定
插入排序 O(n^2) O(1) 稳定

总结

冒泡排序、选择排序和插入排序都是经典的排序算法,它们在不同的情况下都有各自的优缺点。在面试中,能够深入了解这些算法的优缺点,并根据具体情况选择合适的算法,无疑会给面试官留下深刻的印象。