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

我会为你详细讲解“算法系列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日

相关文章

  • JS中的算法与数据结构之列表(List)实例详解

    首先,列表(List)是一种非常常见且重要的数据结构,用于存储一组顺序排列的数据。在JavaScript中,可以通过数组来实现列表。 具体来说,我们可能会涉及到一些常用的列表操作,例如: 在数组尾部添加一个元素 在数组特定位置插入一个元素 从数组中删除指定元素 获取数组中指定位置的元素 下面,我们将结合代码示例,一一介绍这些操作: 在数组尾部添加一个元素 在…

    算法与数据结构 2023年5月19日
    00
  • 利用JavaScript在网页实现八数码启发式A*算法动画效果

    下面是利用JavaScript在网页实现八数码启发式A*算法动画效果的完整攻略: 简介 八数码问题是指在一个33的方格上,放置了1~8这八个数字,其中有一个空格可以移动,初态和目标态之间的变换最少需要几步。而启发式A算法是一种针对图形和网络中的路径规划问题的搜索算法。 利用JavaScript实现八数码启发式A*算法动画效果,可以帮助用户在屏幕上直观地看到计…

    算法与数据结构 2023年5月19日
    00
  • input标签内容改变的触发事件介绍

    当用户在表单中输入内容时,网页需要对用户输入进行实时的响应,以方便用户进行修改和确认。而input标签就是常用于表单输入的标签之一,它提供了多种类型的输入框,如文本框、单选框、复选框、下拉框等。在这些输入框中,当其中的内容发生改变时,我们需要将其更新到网页中,这时就需要用到“input标签内容改变的触发事件”。 事件是指在特定的时刻发生的动作或行为,而事件处…

    算法与数据结构 2023年5月19日
    00
  • JavaScript中几种排序算法的简单实现

    JavaScript中几种排序算法的简单实现 排序算法在计算机科学中是一个基本问题。不同的排序算法具有不同的时间和空间复杂度,选择合适的排序算法可以提高程序的效率。本文介绍了JavaScript中几种排序算法的简单实现,包括冒泡排序、选择排序、插入排序、归并排序和快速排序。 冒泡排序 冒泡排序是最简单的排序算法之一。它重复遍历列表,比较相邻的元素,并交换它们…

    算法与数据结构 2023年5月19日
    00
  • javascript基本常用排序算法解析

    让我来为您详细讲解“JavaScript基本常用排序算法解析”的完整攻略。 一、前言 排序算法是计算机科学中最常用的算法之一。它可以将我们需要排序的数据快速进行排序,加速我们的代码算法运行速度。在本篇文章中,我们将给您介绍一些基本的、常用的排序算法。 二、常用排序算法 冒泡排序 冒泡排序是一种比较简单但实用的排序算法,也是最基本的排序算法之一。它的基本思想是…

    算法与数据结构 2023年5月19日
    00
  • 基于Go语言实现冒泡排序算法

    基于Go语言实现冒泡排序算法 什么是冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,因而得名“冒泡排序”。该算法因其简单的实现方式和易于理解的原理而广泛应用。 冒泡排序算法实现方式 冒泡排序的算法原理如下: 比较相邻的元素。如果第一个…

    算法与数据结构 2023年5月19日
    00
  • c#实现选择排序的示例

    C#实现选择排序主要包含以下步骤: 定义数组 遍历数组,选出最小元素,并记录其索引 交换当前索引和最小值索引的元素 循环执行步骤2和步骤3,直到整个数组排序完成 以下是实现选择排序的C#示例: 示例1: int[] arr = new int[]{5, 3, 9, 1, 7, 4}; for (int i = 0; i <arr.Length; i++…

    算法与数据结构 2023年5月19日
    00
  • 堆排序原理及算法代码详解

    堆排序原理及算法代码详解 堆排序属于一种选择排序,它的基本思想是利用堆这种数据结构来进行排序。 堆的概念 堆(Heap)是一个特殊的树形数据结构,它有以下两种类型: 大根堆:每个节点的值都大于或等于其左右孩子节点的值。 小根堆:每个节点的值都小于或等于其左右孩子节点的值。 通过对堆进行操作,可以得到堆排序算法。 堆排序的基本思想 将待排序序列构造成一个大根堆…

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