Python函数:编写自定义排序算法
在Python中,有许多内置的排序方法,如sorted()和sort()方法。这些方法可以根据指定的条件对列表进行排序,如按数字大小、按字母顺序等。一般情况下,这些内置方法已经能够满足我们的需求。但是,有时候我们需要实现一些特定的排序算法,以满足特定的排序需求。比如,我们想按照某个关键字的长度、字母个数、重复出现次数等因素进行排序,这时候使用自定义排序算法就很有必要了。
一、使用sorted()方法自定义排序算法
sorted()方法是Python的内置方法,可以根据指定参数对列表进行排序。如果我们想使用自定义排序算法,可以通过给sorted()方法传递一个自定义的函数,来实现自定义排序算法。这个自定义函数需要有两个参数,即待排序列表的每个元素和排序的规则。在下面的例子中,我们将按照字符串长度对列表进行排序:
def sort_by_length(str):
return len(str)
lst = ['banana', 'apple', 'pear', 'orange']
sorted_lst = sorted(lst, key=sort_by_length)
print(sorted_lst)
在这个例子中,sort_by_length()方法返回每个字符串的长度。然后我们使用key参数将这个方法传递给sorted()方法,让它按照长度对字符串进行排序。
二、使用sort()方法自定义排序算法
sort()方法也是Python内置方法,可以对列表进行原地排序,即不创建一个新的排序后列表。这个方法同样可以通过传递一个自定义函数来实现自定义排序算法。这个自定义函数和sorted()的自定义函数相同,也需要有两个参数。
def sort_by_count(lst):
return lst.count('apple')
lst = ['banana', 'apple', 'pear', 'orange', 'apple']
lst.sort(key=sort_by_count)
print(lst)
在这个例子中,sort_by_count()方法返回元素'apple'在列表中的出现次数。我们使用这个方法作为key参数传递给sort()方法,让它根据'apple'出现的次数对列表进行排序。
三、实现自己的排序算法
有时候,Python内置的排序方法可能无法满足我们的需求,这时候需要实现自己的排序算法。下面我们就来实现一下常见的排序算法:冒泡排序和快速排序。
1. 冒泡排序
冒泡排序是一种简单的排序算法,其基本思想是通过相邻元素之间的比较和交换来达到排序的目的。具体实现方法如下:
def bubble_sort(lst):
for i in range(len(lst)):
for j in range(len(lst)-i-1):
if lst[j] > lst[j+1]:
lst[j], lst[j+1] = lst[j+1], lst[j]
return lst
lst = [64, 34, 25, 12, 22, 11, 90]
sorted_lst = bubble_sort(lst)
print(sorted_lst)
在这个例子中,我们使用了两个嵌套的循环来遍历列表。外层循环用来控制需要比较的次数,内层循环用来进行相邻元素的比较,如果当前元素比下一个元素大,就交换它们的位置。这样,每次循环后,最大的元素都会被移动到最后。直到排序完成。冒泡排序的时间复杂度为O(n^2)。
2. 快速排序
快速排序是一种效率较高的排序算法,它的原理是在列表中选择一个基准元素,将小于等于基准元素的元素移到其左边,将大于基准元素的元素移到其右边,然后再对左右两个子列表重复这个过程,直到整个列表有序。具体实现方法如下:
def quick_sort(lst):
if len(lst) <= 1:
return lst
pivot = lst[len(lst)//2]
left_lst = [x for x in lst if x < pivot]
middle_lst = [x for x in lst if x == pivot]
right_lst = [x for x in lst if x > pivot]
return quick_sort(left_lst) + middle_lst + quick_sort(right_lst)
lst = [64, 34, 25, 12, 22, 11, 90]
sorted_lst = quick_sort(lst)
print(sorted_lst)
在这个例子中,我们首先判断列表的长度是否小于等于1,如果是,则直接返回该列表。否则,我们选择列表中间的元素作为基准元素,将小于等于基准元素的元素移到一个列表中,将大于基准元素的元素移到另一个列表中,并将基准元素放入中间列表中。这三个列表经过递归调用quick_sort()方法排序后,再以left_lst+middle_lst+right_lst的形式合并起来,就是有序的列表了。快速排序的时间复杂度为O(nlogn)。
总结
至此,我们学习了如何通过内置的sorted()和sort()方法,以及自定义的冒泡排序和快速排序等算法实现自定义排序。这些排序算法可以让我们按照特定的规则进行排序,更好地满足我们的排序需求。在选择使用哪种排序算法时,需要综合考虑时间复杂度、稳定性等因素,选择最适合当前情况的算法。
