算法系列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日

相关文章

  • 基于Go语言实现插入排序算法及优化

    基于Go语言实现插入排序算法及优化攻略 插入排序算法 插入排序是一种简单直观的排序方法,主要思路是将未排序部分的第一个元素插入到已排序部分合适的位置。具体实现方式如下: func InsertionSort(arr []int) { n := len(arr) for i := 1; i < n; i++ { // 寻找arr[i]合适的插入位置 fo…

    算法与数据结构 2023年5月19日
    00
  • php实现的常见排序算法汇总

    PHP实现的常见排序算法汇总 本文主要介绍几种PHP实现常见排序算法的方法,帮助读者快速了解和使用这些排序算法。 排序算法是计算机编程领域中非常重要的基础算法之一,可以用于对数据进行排序,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序等,本文将介绍其中的三种算法。 冒泡排序 冒泡排序是一种简单直观的排序算法,通过比较相邻元素的大小,将较大的元素逐个…

    算法与数据结构 2023年5月19日
    00
  • ASP使用FSO读取模板的代码

    ASP(Active Server Pages)是Microsoft公司推出的一种服务器端动态网页开发技术。FSO(File System Object)是ASP中访问文件系统的一种重要方式。通过FSO,我们可以实现对文件的读写、创建和删除等操作。在ASP中使用FSO读取模板文件,可以实现动态网站中的静态内容显示。下面是使用FSO读取模板文件的完整攻略: 1…

    算法与数据结构 2023年5月19日
    00
  • 前端JavaScript多数元素的算法详解

    前端JavaScript多数元素的算法详解 算法介绍 多数元素在一个数组中出现次数超过一半的元素,因此要找到多数元素,需要考虑其出现次数是否超过了数组长度的一半。本文介绍三种常见的多数元素算法,分别为排序法、哈希表法和摩尔投票法。 排序法 排序法的思路是先对数组进行排序,然后返回数组中间的那个元素即可。由于多数元素出现次数超过了数组长度的一半,因此排序后中间…

    算法与数据结构 2023年5月19日
    00
  • JavaScript插入排序算法原理与实现方法示例

    JavaScript插入排序算法原理与实现方法示例 算法原理 插入排序是一种简单直观的排序算法,其基本原理是将一个待排序的数组依次插入一个有序的数组中,使得最终生成的有序数组是全局有序的。每次将一个待排序的元素插入到有序数组中时,我们从有序数组的末尾开始比较,如果待排序的元素比当前比较的元素小,则交换位置,继续比较,否则插入到当前位置。 实现方法 下面是Ja…

    算法与数据结构 2023年5月19日
    00
  • Python中利用sorted()函数排序的简单教程

    下面是我为您准备的Python中利用sorted()函数排序的简单教程。 1. sorted()函数的简介 sorted()函数是Python内置函数之一,用于对一个可迭代对象进行排序操作。这个函数返回一个新的列表,而不会修改原来的列表本身。 sorted()函数的基本语法如下所示: sorted(iterable, key=None, reverse=Fa…

    算法与数据结构 2023年5月19日
    00
  • PHP哈希表实现算法原理解析

    PHP哈希表实现算法原理解析 什么是哈希表 哈希表又称为散列表(Hash Table),是根据关键码值(Key-Value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到 Hash 表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(Hash Function),存放记录的数组叫做哈希表(Hash Table)。 PHP哈希表实现…

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

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

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