算法系列15天速成 第一天 七大经典排序【上】

yizhihongxing

我会为你详细讲解“算法系列15天速成 第一天 七大经典排序【上】”的完整攻略。

标题

算法系列15天速成 第一天 七大经典排序【上】

内容

本文主要介绍了常用的七大经典排序算法,分别是插入排序、希尔排序、选择排序、冒泡排序、快速排序、归并排序以及堆排序。对每个算法的特点、实现过程和时间复杂度进行了详细的讲解,同时也对每个算法进行了简单的示例说明。

插入排序

插入排序的基本思想是将待排序的元素插入到已经排好序的序列里面。具体实现过程为:从第一个元素开始,将其插入到已经排好序的序列中,然后再取出下一个元素进行插入,以此类推,直到全部元素有序。时间复杂度为O(n^2)。

以下是一个示例代码:

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

希尔排序

希尔排序是插入排序的一种更高效的改进版本,它通过将序列拆分成若干个小的子序列,然后对每个子序列进行插入排序,最后将所有子序列进行合并。希尔排序的时间复杂度是介于O(n)和O(n^2)之间。

以下是一个示例代码:

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

选择排序

选择排序的基本思想是将整个序列看作是由两个部分组成,一个是已经排好序的部分,另一个是未排好序的部分,每次从未排好序的部分中选择一个最小的元素然后放到已排好序的序列的末尾。选择排序的时间复杂度为O(n^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]
    return array

冒泡排序

冒泡排序的基本思想是两两比较相邻的元素,如果前一个元素比后一个元素大,就交换这两个元素,循环操作直到排序完成。冒泡排序的时间复杂度为O(n^2)。

以下是一个示例代码:

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]
    return array

快速排序

快速排序是一种典型的分治算法,它通过选择一个关键元素把待排序列分成两个子序列,分别对两个子序列进行递归排序,最后将两个子序列合并成一个有序序列。快速排序的时间复杂度为O(nlogn)。

以下是一个示例代码:

def partition(array, left, right):
    pivot_index = left
    pivot = array[pivot_index]
    left += 1
    while True:
        while left <= right and array[left] < pivot:
            left += 1
        while left <= right and array[right] > pivot:
            right -= 1
        if left > right:
            break
        else:
            array[left], array[right] = array[right], array[left]
    array[pivot_index], array[right] = array[right], array[pivot_index]
    return right

def quick_sort_helper(array, left, right):
    if left >= right:
        return
    pivot_index = partition(array, left, right)
    quick_sort_helper(array, left, pivot_index-1)
    quick_sort_helper(array, pivot_index+1, right)

def quick_sort(array):
    quick_sort_helper(array, 0, len(array)-1)
    return array

归并排序

归并排序的基本思想是将待排元素分成若干个子序列,然后将相邻的两个子序列进行归并操作,重复执行此操作直到整个序列有序为止。归并排序的时间复杂度为O(nlogn)。

以下是一个示例代码:

def merge(array, start, mid, end):
    left = array[start:mid]
    right = array[mid:end]
    l, r = 0, 0
    for i in range(start, end):
        if l >= len(left):
            array[i] = right[r]
            r += 1
        elif r >= len(right):
            array[i] = left[l]
            l += 1
        elif left[l] < right[r]:
            array[i] = left[l]
            l += 1
        else:
            array[i] = right[r]
            r += 1

def merge_sort_helper(array, start, end):
    if start >= end - 1:
        return
    mid = start + (end - start) // 2
    merge_sort_helper(array, start, mid)
    merge_sort_helper(array, mid, end)
    merge(array, start, mid, end)

def merge_sort(array):
    merge_sort_helper(array, 0, len(array))
    return array

堆排序

堆排序是一种树形选择排序,是对直接选择排序的有效改进,堆排序的时间复杂度为O(nlogn)。

以下是一个示例代码:

def heapify(array, n, i):
    largest = i
    left = 2*i+1
    right = 2*i+2

    if left < n and array[largest] < array[left]:
        largest = left
    if right < n and array[largest] < array[right]:
        largest = right

    if largest != i:
        array[i], array[largest] = array[largest], array[i]
        heapify(array, n, largest)

def heap_sort(array):
    n = len(array)
    for i in range(n//2-1, -1, -1):
        heapify(array, n, i)

    for i in range(n-1, -1, -1):
        array[0], array[i] = array[i], array[0]
        heapify(array, i, 0)
    return array

以上就是本文对于七大经典排序算法的详细讲解,希望能对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:算法系列15天速成 第一天 七大经典排序【上】 - Python技术站

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

相关文章

  • JavaScript实现的七种排序算法总结(推荐!)

    JavaScript实现的七种排序算法总结(推荐!) 简介 本文介绍了JavaScript实现的七种排序算法,包括插入排序、冒泡排序、选择排序、希尔排序、归并排序、快速排序和堆排序。每种算法都有对应的JavaScript代码实现,并且详细说明了算法的原理、时间复杂度和代码实现过程。 插入排序 插入排序是一种简单的排序算法,它的基本思想是将数组分成已排序和未排…

    算法与数据结构 2023年5月19日
    00
  • 用C语言实现二分查找算法

    当实现查找某个元素时,一个常见的算法是二分查找(Binary Search),也称作折半查找。二分查找是一种在有序数组中查找某一特定元素的搜索算法,将目标值与数组的中间元素进行比较,如果中间元素大于目标值,则在左半部分继续查找;如果中间元素小于目标值,则在右半部分继续查找。重复以上步骤,直到找到目标值或者确定目标值不存在。 以下是在C语言中实现二分查找的完整…

    算法与数据结构 2023年5月19日
    00
  • 深入学习C语言中常见的八大排序

    深入学习C语言中常见的八大排序 前言 排序算法是计算机科学中的基本问题之一,是计算机领域内经典且常见的算法问题之一。排序算法对于优化数据检索、数据压缩、数据库查询效率等方面都有着重要的意义。本文将为您详细讲解常见的八种排序算法的原理、时间复杂度以及应用场景,希望能够对您学习和了解排序算法提供帮助。 简介 排序算法是将一串数据按照一定的规则进行排列,排序算法可…

    算法与数据结构 2023年5月19日
    00
  • java实现图形卡片排序游戏

    以下是“Java实现图形卡片排序游戏”的完整攻略。这个游戏的目标是将打乱的卡片,按顺序排好。具体的操作方法是通过拖拽卡片,让卡片位置移动进行排序。 技术栈 Java语言 Swing GUI库 排序算法 功能设计 加载卡片图片及绑定事件处理方法 卡片随机化处理 拖拽移动卡片 实现移动时的动画效果 判断拼图是否按顺序排好 记录游戏步骤、分数等信息 具体实现 加载…

    算法与数据结构 2023年5月19日
    00
  • c++插入排序详解

    c++插入排序详解 1. 插入排序算法介绍 插入排序法是一种简单直观的排序方法。它的基本思路是通过每次将一个待排序的元素按照其大小插入到已经排好序的一组元素中,直到全部元素插入完毕,即排序完毕。 在实际应用中,对于较小的数据集,插入排序通常比快速排序和归并排序等复杂度为O(nlogn)的算法执行效率更高。 2. 插入排序算法的实现 下面给出一个C++实现的插…

    算法与数据结构 2023年5月19日
    00
  • js实现常用排序算法

    JS实现常用排序算法 排序算法是计算机领域中的重要算法之一,其作用是将一组无序的数据按照一定的规则进行排列,便于数据的查找和统计。在前端开发领域中,JS是常用的编程语言,下面一起来详细讲解如何用JS实现常用排序算法。 冒泡排序 冒泡排序是一种简单的排序算法,其具体思路是对需要排序的元素从头开始进行比较,如果前一个元素比后一个元素大,就交换这两个元素的位置,一…

    算法与数据结构 2023年5月19日
    00
  • 基于python进行桶排序与基数排序的总结

    基于python进行桶排序与基数排序的总结 桶排序 桶排序是一种稳定的排序算法,利用预先定义的桶按照一定的映射关系将待排序的元素分配到不同的桶中,并对每个桶中的元素进行排序,最后将所有桶中的结果合并起来即可。 具体的步骤如下: 找出待排序数组中的最大值max和最小值min,确定所需桶的数量,建立一个包含顺序桶的桶(列表)bucket和一个空列表result。…

    算法与数据结构 2023年5月19日
    00
  • c语言5个常用的排序算法实例代码

    C语言5个常用的排序算法实例代码 本文旨在讲解C语言中常用的5种排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。以下将逐一介绍它们的实现过程,并提供示例代码。 冒泡排序(Bubble Sort) 算法思想:冒泡排序是一种简单的排序算法,它会首先比较相邻的元素,如果它们的顺序不正确,就交换它们的位置。这样一遍比较下来,最后一个元素就已经是最大的…

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