10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)

我简单的绘制了一下排序算法的分类,蓝色字体的排序算法是我们用python3实现的,也是比较常用的排序算法。

Python3常用排序算法

1、Python3冒泡排序——交换类排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。

它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。

走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

作为最简单的排序算法之一,冒泡排序给我的感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,所以最熟悉。

冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。

但这种改进对于提升性能来说并没有什么太大作用。

最快:当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊)

最慢:当输入的数据是反序时(写一个 for 循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗)

Python3冒泡排序实例代码

# 冒泡排序
def bubbleSort(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
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = bubbleSort(list)
  print("List sort is:", result)

效果

2、Python3快速排序-交换类排序

快速排序是由东尼·霍尔所发展的一种排序算法。

在平均状况下,排序 n 个项目要 Ο(nlogn) 次比较。在最坏状况下则需要 Ο(n2) 次比较,但这种状况并不常见。事实上,快速排序通常明显比其他 Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。

快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。

快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。

快速排序的名字起的是简单粗暴,因为一听到这个名字你就知道它存在的意义,就是快,而且效率高!它是处理大数据最快的排序算法之一了。

特点:选基准、分治、递归

Python3快速排序-交换类排序实例源码

# 快速排序
def quickSort(arr, left=None, right=None):
  left = 0 if not isinstance(left,(int, float)) else left
  right = len(arr)-1 if not isinstance(right,(int, float)) else right
  if left < right:
    partitionIndex = partition(arr, left, right)
    quickSort(arr, left, partitionIndex-1)
    quickSort(arr, partitionIndex+1, right)
  return arr
def partition(arr, left, right):
  pivot = left
  index = pivot+1
  i = index
  while i <= right:
    if arr[i] < arr[pivot]:
      swap(arr, i, index)
      index+=1
    i+=1
  swap(arr,pivot,index-1)
  return index-1
def swap(arr, i, j):
  arr[i], arr[j] = arr[j], arr[i]
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = quickSort(list)
  print("List sort is:", result)

Python3快排简写

def quickSort2(array):
  return array if len(array) <= 1 else quickSort2([lt for lt in array[1:] if lt < array[0]]) + array[0:1] + quickSort2([ge for ge in array[1:] if ge >= array[0]])

效果

3、Python3选择排序-选择类排序

选择排序是一种简单直观的排序算法。

无论什么数据进去都是 O(n2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

Python3选择排序-选择类排序实例源码

# 选择排序
def selectionSort(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
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = selectionSort(list)
  print("List sort is:", result)

效果

4、Python3堆排序-选择类排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。

堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

1、大顶堆(大根堆):每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;

2、小顶堆(小根堆):每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

堆排序的平均时间复杂度为 Ο(nlogn)。

Python3堆排序-选择类排序实例源码

# 堆排序
def buildMaxHeap(arr):
  import math
  for i in range(math.floor(len(arr)/2),-1,-1):
    heapify(arr,i)
def heapify(arr, i):
  left = 2*i+1
  right = 2*i+2
  largest = i
  if left < arrLen and arr[left] > arr[largest]:
    largest = left
  if right < arrLen and arr[right] > arr[largest]:
    largest = right
  if largest != i:
    swap(arr, i, largest)
    heapify(arr, largest)
def swap(arr, i, j):
  arr[i], arr[j] = arr[j], arr[i]
def heapSort(arr):
  global arrLen
  arrLen = len(arr)
  buildMaxHeap(arr)
  for i in range(len(arr)-1,0,-1):
    swap(arr,0,i)
    arrLen -=1
    heapify(arr, 0)
  return arr
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = heapSort(list)
  print("List sort is:", result)

效果

5、Python3插入排序-插入类排序

插入排序是一种最简单直观的排序算法。

插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

Python3插入排序-插入类排序实例源码

# 作者:沙振宇
# 插入排序
def insertionSort(arr):
  for i in range(len(arr)):
    preIndex = i-1
    current = arr[i]
    while preIndex >= 0 and arr[preIndex] > current:
      arr[preIndex+1] = arr[preIndex]
      preIndex-=1
    arr[preIndex+1] = current
  return arr
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = insertionSort(list)
  print("List sort is:", result)

效果

6、Python3希尔排序-插入类排序

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。

但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;

2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的基本思想是:

先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。

Python3希尔排序-插入类排序实例源码

# 作者:沙振宇
# 希尔排序
def shellSort(arr):
  import math
  gap=1
  while(gap < len(arr)/3):
    gap = gap*3+1
  while gap > 0:
    for i in range(gap,len(arr)):
      temp = arr[i]
      j = i-gap
      while j >=0 and arr[j] > temp:
        arr[j+gap]=arr[j]
        j-=gap
      arr[j+gap] = temp
    gap = math.floor(gap/3)
  return arr
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = shellSort(list)
  print("List sort is:", result)

效果

7、Python3归并排序-归并类排序

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。

该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

1、自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第 2 种方法);

2、自下而上的迭代;

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间

Python3归并排序-归并类排序实例源码

# 作者:沙振宇
# 归并排序
def mergeSort(arr):
  import math
  if(len(arr)<2):
    return arr
  middle = math.floor(len(arr)/2)
  left, right = arr[0:middle], arr[middle:]
  return merge(mergeSort(left), mergeSort(right))
def merge(left,right):
  result = []
  while left and right:
    if left[0] <= right[0]:
      result.append(left.pop(0))
    else:
      result.append(right.pop(0))
  while left:
    result.append(left.pop(0))
  while right:
    result.append(right.pop(0))
  return result
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = mergeSort(list)
  print("List sort is:", result)

效果

8、Python3计数排序-分布类排序

计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。

作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。

由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。但是,计数排序可以用在基数排序中的算法来排序数据范围很大的数组。

通俗地理解,例如有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。当然,年龄有重复时需要特殊处理(保证稳定性),这就是为什么最后要反向填充目标数组,以及将每个数字的统计减去 1 的原因。

Python3计数排序-分布类排序实例源码

# 作者:沙振宇
# 计数排序
def countingSort(arr, maxValue):
  bucketLen = maxValue+1
  bucket = [0]*bucketLen
  sortedIndex =0
  arrLen = len(arr)
  for i in range(arrLen):
    if not bucket[arr[i]]:
      bucket[arr[i]]=0
    bucket[arr[i]]+=1
  for j in range(bucketLen):
    while bucket[j]>0:
      arr[sortedIndex] = j
      sortedIndex+=1
      bucket[j]-=1
  return arr
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = countingSort(list,max(list))
  print("List sort is:", result)

效果

9、Python3基数排序-分布类排序

基数排序是一种非比较型整数排序算法。

其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

python3基数排序-分布类排序实例源码

# 作者:沙振宇
# 基数排序
def radix_sort(arr):
  """基数排序"""
  i = 0 # 记录当前正在排拿一位,最低位为1
  max_num = max(arr) # 最大值
  j = len(str(max_num)) # 记录最大值的位数
  while i < j:
    bucket_list =[[] for _ in range(10)] #初始化桶数组
    for x in arr:
      bucket_list[int(x / (10**i)) % 10].append(x) # 找到位置放入桶数组
    arr.clear()
    for x in bucket_list:  # 放回原序列
      for y in x:
        arr.append(y)
    i += 1
  return arr
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = radix_sort(list)
  print("List sort is:", result)

效果

Python3桶排序-分布类排序

桶排序是计数排序的升级版。

它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

1、在额外空间充足的情况下,尽量增大桶的数量

2、使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

最快:当输入的数据可以均匀的分配到每一个桶中。

最慢:当输入的数据被分配到了同一个桶中。

Python3桶排序-分布类排序实例源码

# 作者:沙振宇
# 桶排序
def bucketSort(arr):
  # 选择一个最大的数
  max_num = max(arr)
  # 创建一个元素全是0的列表, 当做桶
  bucket = [0] * (max_num + 1)
  # 把所有元素放入桶中, 即把对应元素个数加一
  for i in arr:
    bucket[i] += 1
  # 存储排序好的元素
  sort_nums = []
  # 取出桶中的元素
  for j in range(len(bucket)):
    if bucket[j] != 0:
      for y in range(bucket[j]):
        sort_nums.append(j)
  return sort_nums
if __name__ == '__main__':
  list = [1, 5, 8, 123, 22, 54, 7, 99, 300, 222]
  print("List source is:", list)
  result = bucketSort(list)
  print("List sort is:", result)

效果

本文主要讲解了10个python3常用排序算法详细说明与实例,更多关于python排序算法的知识请查看下面的相关链接

(0)

相关推荐

  • python list多级排序知识点总结

    在python3的sorted中去掉了cmp参数,转而推荐"key+lambda"的方式来排序. 如果需要对python的list进行多级排序.有如下的数据: list_num = [[12,3],[18,34],[18,10],[12,45],[18,10],[8,34]] 需要从小到大的排序.先比较第一个数,如果第一个数相等的话比较第二个数.代码如下: #默认的sort函数会先对第一个比较,如果第一个相等再比较第二个 print(sorted(list_num)) //OUTPUT

  • python 实现多维数组(array)排序

    关于多维数组如何复合排序 如数组: >>> import numpy as np >>> data = np.array([[2,2,5],[2,1,3],[1,2,3],[3,1,4]]) >>>> data array([[2, 2, 5], [2, 1, 3], [1, 2, 3], [3, 1, 4]]) 将数组先按照第一列升序,第二列升序,第三列升序的方式排序: >>> idex=np.lexsort([data[:,

  • 使用python实现希尔、计数、基数基础排序的代码

    希尔排序 希尔排序是一个叫希尔的数学家提出的一种优化版本的插入排序. 首先取一个整数d1=n//2,将元素分为d1个组,每组相邻元素之间的距离为d1,在各组内进行直接插入排序. 取第二个整数d2=d1//2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序. 希尔排序是使整体数据越来越接近有序:最后一趟排序使得所有数据有序. 实现 # 希尔排序 def shell_sort(li): n = len(li) gap = n // 2 while gap > 0: for

  • python常用排序算法的实现代码

    这篇文章主要介绍了python常用排序算法的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 排序是计算机语言需要实现的基本算法之一,有序的数据结构会带来效率上的极大提升. 1.插入排序 插入排序默认当前被插入的序列是有序的,新元素插入到应该插入的位置,使得新序列仍然有序. def insertion_sort(old_list): n=len(old_list) k=0 for i in range(1,n): temp=old_lis

  • Python函数参数类型及排序原理总结

    这篇文章主要介绍了Python函数参数类型及排序原理总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参数,因为位置参数被放在list里面,关键字参数放在dict里面,Python在解读的时候首先处理list,没有遇到关键字就append到list

  • Python将列表中的元素转化为数字并排序的示例

    本文实例讲述了Python中列表元素转为数字的方法.分享给大家供大家参考,具体如下: 有一个数字字符的列表: numbers = ['2', '4', '1', '3'] 想要把每个元素转换为数字: numbers = [2, 4, 1, 3] 1. Python2.x,可以使用map函数: numbers = map(int, numbers) 2. Python3.x,map返回的是map对象,当然也可以转换为List: numbers = list(map(int, numbers)) 排

  • 利用python实现冒泡排序算法实例代码

    冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端. 冒泡排序算法的运作如下: 1.比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数.

  • python实现堆排序的实例讲解

    堆排序 堆是一种完全二叉树(是除了最后一层,其它每一层都被完全填充,保持所有节点都向左对齐),首先需要知道概念:最大堆问题,最大堆就是根节点比子节点值都大,并且所有根节点都满足,那么称它为最大堆.反之最小堆. 当已有最大堆,如下图,首先将7提出,然后将堆中最后一个元素放到顶点上,此时这个堆不满足最大堆了,那么我们要给它构建成最大堆,需要找到此时堆中对打元素然后交换,此时最大值为6,符合最大堆后,我们将6提取出来,然后将堆中最后一个元素放到堆的顶部...以此类推.最后提取的数值7,6,5,4,3,

  • python中字典按键或键值排序的实现代码

    字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按"键"排序和按"值"排序. 按"值"排序 按"值"排序就是根据字典的值进行排序,可以使用内置的sorted()函数. sorted(iterable[, cmp[, key[, reverse]]]) iterable:是可迭代类型类型; cmp:用于比较的

  • python快速排序的实现及运行时间比较

    快速排序的基本思想:首先选定一个数组中的一个初始值,将数组中比该值小的放在左边,比该值大的放在右边,然后分别对左边的数组进行如上的操作,对右边的数组进行如上的操作.(分治+递归) 1.利用匿名函数lambda 匿名函数的基本用法func_name  = lambda x:array,冒号左边的x代表传入的参数,冒号右边的array代表返回值,当然名字是可以自己取的. quick_sort = lambda array: \ array if len(array) <= 1 \ else quic

  • Python实现快速排序的方法详解

    本文实例讲述了Python实现快速排序的方法.分享给大家供大家参考,具体如下: 说起快排的Python实现,首先谈一下,快速排序的思路: 1.取一个参考值放到列表中间,初次排序后,让左侧的值都比他小,右侧的值,都比他大. 2.分别对左侧和右侧的部分递归第1步的操作 实现思路: 两个指针left,right分别指向列表的第一个元素和最后一个元素,然后取一个参考值,默认为第一个列表的第一个元素list[0],称为K 然后left指向的值先和参考值K进行比较,若list[left]小于或等于K值,le

  • python字典排序的方法

    python字典怎么排序? 定义一个字典类型 mydict = {2: '小路', 3: '黎明', 1: '郭富城', 4:'周董'} 可分别打印 key和value 看一下数据 按KEY排序,使用了 lambda和 reverse= False(正序) key和value都输出 reverse= True(逆序) 按value排序,汉字次序不是按拼音输出 sorted并不改变字典本身的数据次序. 输出后为列表和元组 可以 A = sorted(mydict.items(),key = lam

  • Python 使用多属性来进行排序

    Python 中 list.sort() 是列表中非常常用的排序函数, key 参数可以对单个属性进行排序. 但是想要实现类似 sql 中 order by id, age 一样,对多个字段进行排序就不支持了. py2 中 sort() 函数还有个 cmp 参数可以传入一个方法,可以自定义对多个属性进行排序,py3 中移除了这个字段. py3 想要实现这个功能,需要使用 functools 模块中的方法,实例如下 #!/usr/bin/env python # -*- coding:utf-8

随机推荐