Python 数据结构之十大经典排序算法一文通关

Python 数据结构之十大经典排序算法一文通关

一、前置知识

在学习本文之前,需要具备以下基础知识:

二、十大经典排序算法

  1. 冒泡排序
  2. 选择排序
  3. 插入排序
  4. 希尔排序
  5. 归并排序
  6. 快速排序
  7. 堆排序
  8. 计数排序
  9. 桶排序
  10. 基数排序

本文将一一讲解这十种排序算法。

三、冒泡排序

冒泡排序是一种简单的排序算法,它重复地遍历过要排序的数列,一次比较两个元素,如果顺序有误就交换位置。它的实现过程如下:

def bubble_sort(data):
    for i in range(len(data)):
        for j in range(len(data)-1-i):
            if data[j] > data[j+1]:
                data[j], data[j+1] = data[j+1], data[j]
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],冒泡排序算法的输出结果为 [1, 2, 3, 4, 5]。

四、 选择排序

选择排序是一种简单直观的排序算法。它的实现过程如下:

def selection_sort(data):
    for i in range(len(data)):
        min_index = i
        for j in range(i+1, len(data)):
            if data[j] < data[min_index]:
                min_index = j
        data[i], data[min_index] = data[min_index], data[i]
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],选择排序算法的输出结果为 [1, 2, 3, 4, 5]。

五、插入排序

插入排序是一种简单直观的排序算法,它的实现过程如下:

def insertion_sort(data):
    for i in range(1, len(data)):
        key = data[i]
        j = i - 1
        while j >= 0 and data[j] > key:
            data[j+1] = data[j]
            j -= 1
        data[j+1] = key
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],插入排序算法的输出结果为 [1, 2, 3, 4, 5]。

六、希尔排序

希尔排序是一种改进的插入排序算法,它的实现过程如下:

def shell_sort(data):
    gap = len(data) // 2
    while gap > 0:
        for i in range(gap, len(data)):
            temp = data[i]
            j = i
            while j >= gap and data[j-gap] > temp:
                data[j] = data[j-gap]
                j -= gap
            data[j] = temp
        gap //= 2
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],希尔排序算法的输出结果为 [1, 2, 3, 4, 5]。

七、归并排序

归并排序是一种分治思想的算法,它的实现过程如下:

def merge_sort(data):
    if len(data) <= 1:
        return data
    mid = len(data) // 2
    left = merge_sort(data[:mid])
    right = merge_sort(data[mid:])
    return merge(left, right)

def merge(left, right):
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

例如,对于输入列表 [3, 1, 2, 5, 4],归并排序算法的输出结果为 [1, 2, 3, 4, 5]。

八、快速排序

快速排序是一种分治思想的算法,它的实现过程如下:

def quick_sort(data):
    if len(data) <= 1:
        return data
    pivot = data[0]
    left = [x for x in data[1:] if x <= pivot]
    right = [x for x in data[1:] if x > pivot]
    return quick_sort(left) + [pivot] + quick_sort(right)

例如,对于输入列表 [3, 1, 2, 5, 4],快速排序算法的输出结果为 [1, 2, 3, 4, 5]。

九、堆排序

堆排序是一种树形选择排序。它的实现过程如下:

def heap_sort(data):
    def sift_down(start, end):
        root = start
        while True:
            child = 2 * root + 1
            if child > end:
                break
            if child + 1 <= end and data[child] < data[child+1]:
                child += 1
            if data[root] < data[child]:
                data[root], data[child] = data[child], data[root]
                root = child
            else:
                break

    for start in range((len(data)-2)//2, -1, -1):
        sift_down(start, len(data)-1)

    for end in range(len(data)-1, 0, -1):
        data[0], data[end] = data[end], data[0]
        sift_down(0, end-1)
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],堆排序算法的输出结果为 [1, 2, 3, 4, 5]。

十、计数排序

计数排序是一种线性时间复杂度的排序算法,它的实现过程如下:

def counting_sort(data):
    bucket = [0] * (max(data)+1)
    for i in data:
        bucket[i] += 1
    index = 0
    for i in range(len(bucket)):
        while bucket[i] > 0:
            data[index] = i
            index += 1
            bucket[i] -= 1
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],计数排序算法的输出结果为 [1, 2, 3, 4, 5]。

十一、桶排序

桶排序是一种线性时间复杂度的排序算法,它的实现过程如下:

def bucket_sort(data):
    max_num = max(data)
    min_num = min(data)
    bucket_size = 5
    bucket_count = (max_num - min_num) // bucket_size + 1
    buckets = [[] for _ in range(bucket_count)]
    for i in data:
        buckets[(i-min_num)//bucket_size].append(i)
    result = []
    for b in buckets:
        if b:
            result.extend(sorted(b))
    return result

例如,对于输入列表 [3, 1, 2, 5, 4],桶排序算法的输出结果为 [1, 2, 3, 4, 5]。

十二、基数排序

基数排序是一种多关键字排序算法,它的实现过程如下:

def radix_sort(data):
    max_num = max(data)
    max_digits = len(str(max_num))
    mod = 10
    dev = 1
    for i in range(max_digits):
        buckets = [[] for _ in range(mod*2)]
        for j in data:
            bucket_index = j // dev % mod + mod
            buckets[bucket_index].append(j)
        dev *= 10
        data = [x for b in buckets for x in b]
    return data

例如,对于输入列表 [3, 1, 2, 5, 4],基数排序算法的输出结果为 [1, 2, 3, 4, 5]。

结语

以上就是十大经典排序算法的实现过程。需要注意的是,不同的排序算法在不同场景下可能会有不同的表现。掌握不同的排序算法,能够帮助我们更好地解决实际问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 数据结构之十大经典排序算法一文通关 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • C语言实现文件内容按行随机排列的算法示例

    下面我将为您详细介绍“C语言实现文件内容按行随机排列的算法示例”的完整攻略。 1、问题描述 首先,这个算法的问题描述是:实现一个按行随机排列文件内容的算法,要求结果能够尽可能地随机、均匀。 2、算法思路 针对这个问题,我们可以采用以下算法思路: 首先读取文件的全部内容,将其中的每一行存在一个字符串数组中; 然后采用洗牌算法(shuffle algorithm…

    算法与数据结构 2023年5月19日
    00
  • 微信红包随机生成算法php版

    下面我会详细讲解“微信红包随机生成算法php版”的完整攻略。 算法简介 微信的红包算法采用的是二倍均值法,即将总金额分成若干个等份,然后按照一定的规则分配给每个红包领取者,使得每个红包领取者所得到的金额期望相等。具体来说,就是按照以下步骤来生成红包: 首先获取红包数量和总金额。 计算出每个红包的最大金额,即 max = totalAmount / num *…

    算法与数据结构 2023年5月19日
    00
  • JS使用单链表统计英语单词出现次数

    下面是JS使用单链表统计英语单词出现次数的完整攻略。 1. 理解单链表 单链表是一种常见的数据结构,也是一种线性结构,其中每个节点只有一个指针,指向它的后继节点。单链表一般由头指针和头结点组成,头结点不存放任何实际数据。在单链表中,节点可以进行插入、删除、查找等基本操作,是一种十分常用的数据结构。 2. 思路分析 要使用单链表统计英语单词出现次数,可以将单词…

    算法与数据结构 2023年5月19日
    00
  • 又一个PHP实现的冒泡排序算法分享

    下面我将详细讲解一下“又一个PHP实现的冒泡排序算法分享”的完整攻略。 前言 冒泡排序是一种简单直观的排序方法,它重复地走访过要排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。 原理 冒泡排序的原理主要包括以下两个步骤: 比较相邻的元素,如果第一个比第二个大,就交换它们两个; 对每一对相邻元素重复执行步骤 1,直到最后一对元素。这样做…

    算法与数据结构 2023年5月19日
    00
  • 分布式架构Redis中有哪些数据结构及底层实现原理

    分布式架构Redis中有哪些数据结构及底层实现原理 Redis支持的数据结构包括:字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 字符串(String) 字符串是Redis最基础的数据类型,与Java中的String类似,适用于存储任意二进制数据,可以存储字符串、数字、二进制数据等类型的数据。…

    算法与数据结构 2023年5月19日
    00
  • C语言实现快速排序算法

    C语言实现快速排序算法攻略 什么是快速排序算法 快速排序算法是一种常用的排序算法, 它使用递归的方式不断地将待排序序列分为两个部分,直到每个子序列中只有一个元素,最终合并完成整个序列的排序。 步骤 快速排序算法的步骤如下: 从序列中选取一个基准元素 将所有小于基准元素的元素放到基准元素左边,大于基准元素的元素放到基准元素右边 对基准元素左右两个子序列分别执行…

    算法与数据结构 2023年5月19日
    00
  • Javascript中的常见排序算法

    Javascript中的常见排序算法 在Javascript中,排序算法是非常基础和常见的算法之一,也是大多数编程语言都会涉及到的一部分。在实际应用场景中,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序等。 冒泡排序 冒泡排序是一种简单易懂的排序算法,其中每一趟都按照从前往后的顺序比较两个相邻的元素,如果前一个元素大于后一个元素,则交换这…

    算法与数据结构 2023年5月19日
    00
  • C#递归算法之分而治之策略

    C#递归算法之分而治之策略 简介 递归算法是一种非常重要的算法,使用递归算法可以解决很多复杂的问题。分而治之是一种常用的递归思路,即将一个问题分成若干个子问题,分别解决,然后将它们的解合并起来得到原问题的解。 分而治之策略 分而治之策略就是将一个复杂的问题分成若干个相同或相似的子问题,并且逐个解决这些子问题,最后统合起来得到原问题的解。这种算法适用于一些可分…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部