首页 后端开发 Python教程 程序员必须掌握的十大排序算法(上)

程序员必须掌握的十大排序算法(上)

Aug 15, 2023 pm 02:55 PM
排序算法



本期导读

排序算法可以说是每个程序员都必须得掌握的了, 弄明白它们的原理和实现很有必要,以下为大家介绍十大常用排序算法的python实现方式,方便大家学习。


01 冒泡排序——交换类排序
02 快速排序——交换类排序

03 选择排序——选择类排序
04 堆排序——选择类排序

05 插入排序——插入类排序

06 希尔排序——插入类排序

07 归并排序——归并类排序

08 计数排序——分布类排序

09 基数排序——分布类排序

10 桶排序——分布类排序



01
冒泡排序
冒泡排序(Bubble Sort): 一个经典的排序算法,因在算法运行中,极值会像水底的气泡一样逐渐冒出来,因此而得名。

算法原理:
  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。


代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

'''冒泡排序'''

def Bubble_Sort(arr):

    for i in range(1, len(arr)):

        for j in range(0, len(arr)-i):

            if arr[j] > arr[j+1]:

                arr[j], arr[j + 1] = arr[j + 1], arr[j]

    return arr

 

arr = [29, 63, 41, 5, 62, 66, 57, 34, 94, 22]

result = Bubble_Sort(arr)

print('result list: ', result)

# result list: [5, 22, 29, 34, 41, 57, 62, 63, 66, 94]

登录后复制

02
快速排序
快速排序(Quicksort):通过一趟排序将要排序的数据分割成独立的两部分,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列,是对冒泡排序算法的一种改进。

算法原理:
  • 首先设定一个分界值,通过该分界值将数组分成左右两部分。

  • 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值。

  • 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。

  • 重复上述过程,直到左、右两个部分各数据排序完成。


代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

'''快速排序'''

def Quick_Sort(arr):

    # 递归入口及出口

    if len(arr) >= 2:

        # 选取基准值,也可以选取第一个或最后一个元素

        mid = arr[len(arr) // 2]

        # 定义基准值左右两侧的列表

        left, right = [], []

        # 从原始数组中移除基准值

        arr.remove(mid)

        for num in arr:

            if num >= mid:

                right.append(num)

            else:

                left.append(num)

        return Quick_Sort(left) + [mid] + Quick_Sort(right)

    else:

        return arr

 

arr = [27, 70, 34, 65, 9, 22, 47, 68, 21, 18]

result = Quick_Sort(arr)

print('result list: ', result)

# result list: [9, 18, 21, 22, 27, 34, 47, 65, 68, 70]

登录后复制


03
选择排序
选择排序(Selection sort):是一种简单直观的排序算法。无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。

算法原理:
  • 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

  • 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

  • 以此类推,直到所有元素均排序完毕。


代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

'''选择排序'''

def Selection_Sort(arr):

    for i in range(len(arr) - 1):

        # 记录最小数的索引

        minIndex = i

        for j in range(i + 1, len(arr)):

            if arr[j] < arr[minIndex]:

                minIndex = j

        # i 不是最小数时,将 i 和最小数进行交换

        if i != minIndex:

            arr[i], arr[minIndex] = arr[minIndex], arr[i]

    return arr

 

arr = [5, 10, 76, 55, 13, 79, 49, 51, 65, 30]

result = Quick_Sort(arr)

print(&#39;result list: &#39;, result)

# result list: [5, 10, 13, 30, 49, 51, 55, 65, 76, 79]

登录后复制

04
插入排序
插入排序(Insertion Sort)一般也被称为直接插入排序,是一种最简单直观的排序算法

算法原理:
  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。


代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

&#39;&#39;&#39;插入排序&#39;&#39;&#39;

def Insertion_Sort(arr):

    for i in range(1, len(arr)):

        key = arr[i]

        j = i - 1

        while j >= 0 and key < arr[j]:

            arr[j + 1] = arr[j]

            j -= 1

        arr[j + 1] = key

    return arr

 

arr = [31, 80, 42, 47, 35, 26, 10, 5, 51, 53]

result = Insertion_Sort(arr)

print(&#39;result list: &#39;, result)

# result list: [5, 10, 26, 31, 35, 42, 47, 51, 53, 80]

登录后复制

05
堆排序
堆排序(Heap sort):是指利用堆这种数据结构所设计的一种排序算法,堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。

算法原理:
  • 创建一个堆 H[0……n-1];

  • 把堆首(最大值)和堆尾互换;

  • 把堆的尺寸缩小 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;

  • 重复步骤 2,直到堆的尺寸为 1。


代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

&#39;&#39;&#39;堆排序&#39;&#39;&#39;

def Heapify(arr, n, i):

    largest = i

    # 左右节点分块

    left = 2 * i + 1

    right = 2 * i + 2

    if left < n and arr[i] < arr[left]:

        largest = left

    if right < n and arr[largest] < arr[right]:

        largest = right

    if largest != i:

        # 大小值交换

        arr[i], arr[largest] = arr[largest], arr[i]

        # 递归

        Heapify(arr, n, largest)

 

def Heap_Sort(arr):

    nlen = len(arr)

    for i in range(nlen, -1, -1):

        # 调整节点

        Heapify(arr, nlen, i)

    for i in range(nlen - 1, 0, -1):

        arr[i], arr[0] = arr[0], arr[i]

        # 调整节点

        Heapify(arr, i, 0)

    return arr

 

arr = [26, 53, 83, 86, 5, 46, 72, 21, 4, 75]

result = Heap_Sort(arr)

print(&#39;result list: &#39;, result)

# result list: [4, 5, 21, 26, 46, 53, 72, 75, 83, 86]

登录后复制

以上是程序员必须掌握的十大排序算法(上)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

快手双边市场的复杂实验设计问题 快手双边市场的复杂实验设计问题 Apr 15, 2023 pm 07:40 PM

一、问题背景1、双边市场实验介绍双边市场,即平台,包含生产者与消费者两方参与者,双方相互促进。比如快手有视频的生产者,视频的消费者,两种身份可能存在一定程度重合。双边实验是在生产者和消费者端组合分组的实验方式。双边实验具有以下优点:(1)可以同时检测新策略对两方面的影响,例如产品DAU和上传作品人数变化。双边平台往往有跨边网络效应,读者越多,作者越活跃,作者越活跃,读者也会跟着增加。(2)可以检测效果溢出和转移。(3)帮助我们更好得理解作用的机制,AB实验本身不能告诉我们原因和结果之间的关系,只

谷歌借AI打破十年排序算法封印,每天被执行数万亿次,网友却说是最不切实际的研究? 谷歌借AI打破十年排序算法封印,每天被执行数万亿次,网友却说是最不切实际的研究? Jun 22, 2023 pm 09:18 PM

整理|核子可乐,褚杏娟接触过基础计算机科学课程的朋友们,肯定都曾亲自动手设计排序算法——也就是借助代码将无序列表中的各个条目按升序或降序方式重新排列。这是个有趣的挑战,可行的操作方法也多种多样。人们曾投入大量时间探索如何更高效地完成排序任务。作为一项基础操作,大多数编程语言的标准库中都内置有排序算法。世界各地的代码库中使用了许多不同的排序技术和算法来在线组织大量数据,但至少就与LLVM编译器配套使用的C++库而言,排序代码已经有十多年没有任何变化了。近日,谷歌DeepMindAI小组如今开发出一

Vue技术开发中如何进行数据筛选和排序 Vue技术开发中如何进行数据筛选和排序 Oct 09, 2023 pm 01:25 PM

Vue技术开发中如何进行数据筛选和排序在Vue技术开发中,数据筛选和排序是非常常见和重要的功能。通过数据筛选和排序,我们可以快速查询和展示我们需要的信息,提高用户体验。本文将介绍在Vue中如何进行数据筛选和排序,并提供具体的代码示例,帮助读者更好地理解和运用这些功能。一、数据筛选数据筛选是指根据特定的条件筛选出符合要求的数据。在Vue中,我们可以通过comp

Swoole进阶:如何使用多线程实现高速排序算法 Swoole进阶:如何使用多线程实现高速排序算法 Jun 14, 2023 pm 09:16 PM

Swoole是一款基于PHP语言的高性能网络通信框架,它支持多种异步IO模式和多种高级网络协议的实现。在Swoole的基础上,我们可以利用其多线程功能实现高效的算法运算,例如高速排序算法。高速排序算法(QuickSort)是一种常见的排序算法,通过定位一个基准元素,将元素分为两个子序列,小于基准元素的放在左侧,大于等于基准元素的放在右侧,再对左右子序列递归

如何实现C#中的选择排序算法 如何实现C#中的选择排序算法 Sep 20, 2023 pm 01:33 PM

如何实现C#中的选择排序算法选择排序(SelectionSort)是一种简单直观的排序算法,其基本思想是每次从待排序元素中选择最小(或最大)的元素,放到已排序的序列末尾。通过重复这个过程,直到所有元素都排序完成。下面我们来详细了解如何在C#中实现选择排序算法,同时附上具体的代码示例。创建选择排序方法首先,我们需要创建一个用于实现选择排序的方法。该方法接受一

如何使用C++中的基数排序算法 如何使用C++中的基数排序算法 Sep 19, 2023 pm 12:15 PM

如何使用C++中的基数排序算法基数排序算法是一种非比较性的排序算法,它通过将待排序的元素分割成一组有限的数字位来完成排序。在C++中,我们可以使用基数排序算法来对一组整数进行排序。下面我们将详细讨论如何实现基数排序算法,并附上具体的代码示例。算法思想基数排序算法的思想是将待排序的元素分割成一组有限的数字位,然后依次对每个位上的元素进行排序。在每个位上的排序完

数组的排序算法有哪些? 数组的排序算法有哪些? Jun 02, 2024 pm 10:33 PM

数组排序算法用于按特定顺序排列元素。常见的算法类型包括:冒泡排序:通过比较相邻元素交换位置。选择排序:找出最小元素交换到当前位置。插入排序:逐个插入元素到正确位置。快速排序:分治法,选择枢纽元素划分数组。合并排序:分治法,递归排序和合并子数组。

如何使用MySQL和Java实现一个简单的排序算法功能 如何使用MySQL和Java实现一个简单的排序算法功能 Sep 20, 2023 am 09:45 AM

如何使用MySQL和Java实现一个简单的排序算法功能导言:在软件开发中,排序算法是非常基础且常用的功能之一。本文将介绍如何使用MySQL和Java实现一个简单的排序算法功能,并提供具体代码示例。一、排序算法概述排序算法是将一组数据按照特定规则进行排列的算法,常用的排序算法有冒泡排序、插入排序、选择排序、快速排序等。本文将以冒泡排序为例进行讲解及实现。二、M

See all articles