排序算法总结

Title of Content

  • 冒泡排序 Bubble sort
    • 概念
    • 排序可视化
    • 代码实现
  • 选择排序 Selection sort
  • 插入排序


冒泡排序 Bubble sort

概念

解释:
compares adjacent items and swaps them if they are in the wrong order
每轮遍历后的效果:
最大/最小的元素到达数字末尾
排序算法总结_第1张图片
排序算法总结_第2张图片
排序算法总结_第3张图片
优化实现: 当外层循环(对整个数组的一次遍历)的这一轮遍历时没有进行交换,意味着整个数组已经有序,迭代没有必要再进行。
排序算法总结_第4张图片

排序可视化

https://www.hackerearth.com/practice/algorithms/sorting/bubble-sort/visualize/

代码实现

  • Python - 基础实现
def bubbleSort(intList, sort="asc"):
    """
    对整数列表进行冒泡排序。

    :param intList: 需要排序的整数列表。
    :param sort: 排序方式,"asc" 表示升序(默认),"desc" 表示降序。
                 如果提供了除 "asc" 或 "desc" 之外的 sort 参数,将默认采用升序排序。
    :return: None。函数直接对输入的列表进行排序,不返回任何值。
    """
    n = len(intList)

    # 如果 sort 参数不是 "asc" 或 "desc",默认为升序
    if sort not in ["asc", "desc"]:
        sort = "asc"

    for i in range(n):
        # inner sort
        # n-i-1 外层每循环i次,得到i个最大值在末尾,因此这i个位置不用比,-1是因为防止j+1越界
        for j in range(n - i - 1):

            if (sort == "asc" and intList[j] > intList[j + 1]) or \
                    (sort == "desc" and intList[j] < intList[j + 1]):
                temp = intList[j + 1]
                intList[j + 1] = intList[j]
                intList[j] = temp

# 测试代码
sample_intList = [60, 10, 90, 50, 100, 80, 70, 30, 40, 20]
bubbleSort(sample_intList, "desc")
print(sample_intList)
bubbleSort(sample_intList, "asc")
print(sample_intList)

排序结果:
在这里插入图片描述

  • Python - 优化实现
    增加判断这轮迭代有无进行元素交换的标记swapped
def bubbleSort(intList, sort="asc"):
    """
    对整数列表进行冒泡排序。

    :param intList: 需要排序的整数列表。
    :param sort: 排序方式,"asc" 表示升序(默认),"desc" 表示降序。
                 如果提供了除 "asc" 或 "desc" 之外的 sort 参数,将默认采用升序排序。
    :return: None。函数直接对输入的列表进行排序,不返回任何值。
    """
    n = len(intList)

    # 如果 sort 参数不是 "asc" 或 "desc",默认为升序
    if sort not in ["asc", "desc"]:
        sort = "asc"

    for i in range(n):
        # inner sort
        # n-i-1 外层每循环i次,得到i个最大值在末尾,因此这i个位置不用比,-1是因为防止j+1越界
        for j in range(n - i - 1):
            swapped = False  # 这轮循环有无进行交换
            if (sort == "asc" and intList[j] > intList[j + 1]) or \
                    (sort == "desc" and intList[j] < intList[j + 1]):
                temp = intList[j + 1]
                intList[j + 1] = intList[j]
                intList[j] = temp
                swapped = True

        # 如果刚刚那轮内层的遍历没有进行过交换,意味着数组已经有序,没有必要再进行后续的遍历
        if not swapped:
            break
  • Java
在这里插入代码片
  • C++
在这里插入代码片

选择排序 Selection sort

插入排序

你可能感兴趣的:(算法,排序算法)