返回

排序与搜索算法:掌握数据结构基础

前端

数据结构和算法是计算机科学的基石,排序和搜索算法更是其中不可或缺的重要组成部分。排序算法通过将一系列元素按特定顺序排列,而搜索算法则用于在数据结构中查找特定元素。掌握这些算法不仅对于编程至关重要,而且还能提升我们解决问题的思维能力。

排序算法

排序算法有多种,每种算法都有其独特的优点和缺点。以下是五种最常用的排序算法:

冒泡排序

冒泡排序是一种简单直观的排序算法。其原理是不断比较相邻元素,并将较大的元素交换到后面。重复这一过程,直到所有元素按升序排列。

选择排序

选择排序是一种比冒泡排序更有效的算法。其原理是每次从剩余元素中选择最小元素,并将其交换到待排序序列的开头。重复这一过程,直到所有元素按升序排列。

插入排序

插入排序是一种稳定的排序算法。其原理是将每个待排序元素依次插入到已排序序列中。重复这一过程,直到所有元素按升序排列。

快速排序

快速排序是一种高效的排序算法,其平均时间复杂度为 O(n log n)。其原理是选取一个枢轴元素,将待排序序列划分为两部分:比枢轴元素小的元素和比枢轴元素大的元素。然后递归地对这两个部分进行排序。

归并排序

归并排序是一种稳定的排序算法,其平均时间复杂度也为 O(n log n)。其原理是将待排序序列递归地划分为更小的子序列,对这些子序列进行排序,然后将排序后的子序列合并成一个有序的序列。

搜索算法

搜索算法用于在数据结构中查找特定元素。以下两种搜索算法最为常用:

线性搜索

线性搜索是一种简单易懂的搜索算法。其原理是逐个检查数据结构中的元素,直到找到目标元素或到达数据结构的末尾。

二分搜索

二分搜索是一种高效的搜索算法,其平均时间复杂度为 O(log n)。其原理是将数据结构划分为两半,比较目标元素与中间元素,根据比较结果缩小搜索范围。重复这一过程,直到找到目标元素或确定目标元素不存在。

实战案例

合并两个有序链表

  • 问题 给定两个有序链表 l1 和 l2,将它们合并为一个新的有序链表。

  • 解法:

  1. 创建一个新的空链表 dummy。
  2. 设置两个指针 curr1 和 curr2 分别指向 l1 和 l2。
  3. 循环比较 curr1 和 curr2 的值,将较小的值添加到 dummy 中。
  4. 将较小的值的指针指向下一个元素。
  5. 重复步骤 3 和 4,直到 curr1 或 curr2 为空。
  6. 将剩余的链表追加到 dummy 后面。
def mergeTwoLists(l1, l2):
  dummy = ListNode(0)
  curr1 = l1
  curr2 = l2
  curr = dummy
  while curr1 and curr2:
    if curr1.val < curr2.val:
      curr.next = curr1
      curr1 = curr1.next
    else:
      curr.next = curr2
      curr2 = curr2.next
    curr = curr.next
  curr.next = curr1 or curr2
  return dummy.next

猜数字大小

  • 问题: 你需要猜测一个数字,系统会告诉你你的猜测是否太大了、太小了还是正好对了。

  • 解法:

  1. 设置两个指针 low 和 high,分别代表猜测范围的最小值和最大值。
  2. 每次猜测中值 mid = (low + high) // 2。
  3. 如果 mid 太大了,则 high = mid - 1。
  4. 如果 mid 太小了,则 low = mid + 1。
  5. 如果 mid 正好了,则返回 mid。
  6. 重复步骤 2-5,直到找到答案。
def guessNumber(n):
  low = 1
  high = n
  while low <= high:
    mid = (low + high) // 2
    result = guess(mid)
    if result == 0:
      return mid
    elif result == -1:
      high = mid - 1
    else:
      low = mid + 1