面试刷题必看!Python中的5大排序算法及其实现代码

开发 后端 算法
排序是每个 IT 工程师和开发人员必备的知识技能。不仅要通过编程面试,而且要了解算法本身。不同的排序算法很好地展示了算法设计如何对程序的复杂性、速度和效率产生如此大的影响。

 排序是每个 IT 工程师和开发人员必备的知识技能。不仅要通过编程面试,而且要了解算法本身。不同的排序算法很好地展示了算法设计如何对程序的复杂性、速度和效率产生如此大的影响。

让我们来看看排名前5,也是最常见,面试中经常被问到的排序算法,看看如何用Python实现它们!

 

[[337940]]

 

1.冒泡排序

冒泡排序是 CS 入门课程中最常讲授的一种,因为它清楚地说明了排序的工作原理,同时又简单又易于理解。冒泡排序将逐步遍历列表并比较相邻的元素对。如果元素的顺序错误,则会交换这些元素。重复对列表中未排序部分的遍历,直到对列表进行排序。因为冒泡排序重复地通过列表中未排序的部分,所以它的最坏情况复杂性为O(n²)。

 

 

 

  1. def bubble_sort(arr): 
  2.     def swap(i, j): 
  3.         arr[i], arr[j] = arr[j], arr[i] 
  4.  
  5.     n = len(arr) 
  6.     swapped = True 
  7.      
  8.     x = -1 
  9.     while swapped: 
  10.         swapped = False 
  11.         x = x + 1 
  12.         for i in range(1, n-x): 
  13.             if arr[i - 1] > arr[i]: 
  14.                 swap(i - 1, i) 
  15.                 swapped = True 
  16.                      
  17.     return arr 

2.选择排序

选择排序也相当简单,优于冒泡排序。如果你要在这两者之间进行选择,那么最好使用默认的“右选择排序”。使用选择排序,我们将输入列表/数组分为两部分:已排序项的子列表和构成列表其余部分的剩余项的子列表。

我们首先在未排序的子列表中找到最小的元素,并将其放在已排序子列表的末尾。因此,我们不断地获取最小的未排序元素,并将其按排序顺序放入已排序的子列表中。此过程将重复进行,直到列表完全排序。

 

 

 

  1. def selection_sort(arr):         
  2.     for i in range(len(arr)): 
  3.         minimum = i 
  4.          
  5.         for j in range(i + 1, len(arr)): 
  6.             # 选择最小值 
  7.             if arr[j] < arr[minimum]: 
  8.                 minimum = j 
  9.  
  10.         # 把它放在已排序的数组结尾 
  11.         arr[minimum], arr[i] = arr[i], arr[minimum] 
  12.              
  13.     return arr 

3.插入排序

插入排序比冒泡排序和选择排序都要快,而且可以说更加简单。就像在玩纸牌游戏时,洗牌的过程就是反复进行插入排序!在每次循环迭代中,插入排序从数组中删除一个元素。然后在另一个排序数组中查找该元素所属的位置,并将其插入其中。它重复这个过程,直到没有输入元素保留。

 

 

 

  1. def insertion_sort(arr): 
  2.          
  3.     for i in range(len(arr)): 
  4.         cursor = arr[i] 
  5.         pos = i 
  6.          
  7.         while pos > 0 and arr[pos - 1] > cursor
  8.             # 交换列表中的数字 
  9.             arr[pos] = arr[pos - 1] 
  10.             pos = pos - 1 
  11.         # 中断并进行最终交换 
  12.         arr[pos] = cursor 
  13.  
  14.     return arr 

4.合并排序

合并排序是一个完美的分而治之的算法例子。使用这种算法只需要通过以下两个主要步骤:

(1) 连续分割未排序的列表,直到有N个子列表,其中每个子列表都有1个“未排序”的元素,N是原始数组中的元素数。

(2) 反复合并,即一次将两个子列表合并在一起,生成新的已排序子列表,直到所有元素都完全合并到一个已排序的数组中。

 

面试刷题必看!Python中的5大排序算法及其实现代码

 

 

  1. def merge_sort(arr): 
  2.     # 对最后一个数组进行拆分 
  3.     if len(arr) <= 1: 
  4.         return arr 
  5.     mid = len(arr) // 2 
  6.     # 在两个部分上递归执行merge_sort 
  7.     leftright = merge_sort(arr[:mid]), merge_sort(arr[mid:]) 
  8.  
  9.     # 合并在一起 
  10.     return merge(leftright, arr.copy()) 
  11.  
  12.  
  13. def merge(leftright, merged): 
  14.  
  15.     left_cursor, right_cursor = 0, 0 
  16.     while left_cursor < len(leftand right_cursor < len(right): 
  17.        
  18.         # 将每一个排序并放入结果 
  19.         if left[left_cursor] <= right[right_cursor]: 
  20.             merged[left_cursor+right_cursor]=left[left_cursor] 
  21.             left_cursor += 1 
  22.         else
  23.             merged[left_cursor + right_cursor] = right[right_cursor] 
  24.             right_cursor += 1 
  25.              
  26.     for left_cursor in range(left_cursor, len(left)): 
  27.         merged[left_cursor + right_cursor] = left[left_cursor] 
  28.          
  29.     for right_cursor in range(right_cursor, len(right)): 
  30.         merged[left_cursor + right_cursor] = right[right_cursor] 
  31.  
  32.     return merged 

5.快速排序

快速排序也是一种分而治之的算法,与合并排序一样。尽管它有点复杂,但在大多数标准实现中,它的执行速度比合并排序快得多,而且很少达到O(n²)的最坏情况复杂度。它有三个主要步骤:

(1) 我们首先从数组中选择一个元素,称之为pivot。

(2) 将小于轴的所有元素移到轴的左侧;将大于轴的所有元素移到轴的右侧。这称为分区操作。

(3) 递归地将上述2个步骤分别应用于元素的每个子数组,这些元素的值比上一个轴的值小或大。

 

面试刷题必看!Python中的5大排序算法及其实现代码

 

 

  1. def partition(array, beginend): 
  2.     pivot_idx = begin 
  3.     for i in xrange(begin+1, end+1): 
  4.         if array[i] <= array[begin]: 
  5.             pivot_idx += 1 
  6.             array[i], array[pivot_idx] = array[pivot_idx], array[i] 
  7.     array[pivot_idx], array[begin] = array[begin], array[pivot_idx] 
  8.     return pivot_idx 
  9.  
  10. def quick_sort_recursion(array, beginend): 
  11.     if begin >= end
  12.         return 
  13.     pivot_idx = partition(array, beginend
  14.     quick_sort_recursion(array, begin, pivot_idx-1) 
  15.     quick_sort_recursion(array, pivot_idx+1, end
  16.  
  17. def quick_sort(array, begin=0, end=None): 
  18.     if end is None: 
  19.         end = len(array) - 1 
  20.      
  21.     return quick_sort_recursion(array, beginend

--END--

很多同学在学习 Python 时,都会遇到各种各样的算法问题,有些很容易就能搞懂,但是有些就需要一些时间精力来学习。

本文中的5种排序算法比较适合 Python 新手,大多数老程序员对排序算法已经炉火纯青了,都是在面试过程中,被迫学习的。

责任编辑:华轩 来源: 今日头条
相关推荐

2021-08-25 09:59:00

开发排序代码

2015-10-08 09:08:50

Python实现

2018-10-10 14:03:00

Java开发代码

2020-09-14 14:47:13

排序算法

2019-05-29 17:45:32

JavaScript算法思路代码实现

2015-11-12 11:05:07

java排序算法

2016-09-30 14:23:16

数据结构算法八大排序算法

2020-09-25 08:49:42

HashMap

2020-11-25 10:40:58

程序员技能开发者

2015-11-03 09:24:12

Java读写锁分析

2012-09-10 10:39:04

IBMdw

2011-03-18 10:26:47

Java对象

2022-03-10 12:03:33

Python算法代码

2017-02-09 16:16:24

Java负载均衡算法

2019-08-28 11:08:51

排序算法Java

2019-04-12 09:00:01

负载均衡Java服务器

2011-08-29 11:25:29

清空service bSQL Server

2023-10-30 13:31:22

Springboot工具Java

2012-06-28 14:01:30

Java程序员排序

2017-11-22 10:53:22

点赞
收藏

51CTO技术栈公众号