Python列表排序实战:内置函数与常用算法详解
本文详细介绍Python中实现列表排序的多种方法。首先解析内置函数list.sort()与sorted()的区别及参数用法,包括cmp、key和reverse。随后深入讲解冒泡、选择、插入、快速及希尔排序等经典算法的实现逻辑与代码示例,帮助开发者掌握从基础调用到底层算法的完整排序技能。
Python列表排序概述
排序是各类编程语言中处理数据的核心操作之一。在Python中,针对列表数据的排序有多种实现路径,本文将基于列表数据结构展开具体说明。
内置排序函数详解
一、利用Python内置函数进行排序
Python提供了便捷的内置函数来直接调用并完成排序任务,无需额外编写复杂逻辑。
Python列表对象包含一个内置的list.sort()方法,该方法会直接修改原列表。此外,还有一个内置函数sorted(),它能够接收任何可迭代对象并返回一个新的已排序列表。
1. sort()函数:
list.sort(cmp=None, key=None, reverse=False)
该函数的参数定义如下:
cmp -- 可选参数,若指定此参数,则使用指定的比较方法进行排序。
key -- 指定用于比较的元素,该参数仅接受一个值,具体取自可迭代对象中的元素,用于确定排序依据。
reverse -- 控制排序规则,当reverse = True时为降序排列,reverse = False时为升序排列(默认值)。
若未指定特殊参数,直接输入列表即可进行默认排序,示例如下:
list=[1,2,4,5,3]
list.sort()
print(list)
>>>[1,2,3,4,5]
2. sorted()函数:
sorted(iterable, cmp=None, key=None, reverse=False)
其参数说明如下:
iterable -- 指定需要排序的可迭代对象。
cmp -- 比较函数,该函数接收两个参数,值均从可迭代对象中取出。函数需遵循比较规则:若前者大于后者返回1,小于则返回-1,相等返回0。
key -- 主要用于指定比较元素,该参数仅有一个值,具体取自可迭代对象中的元素,用于指定排序的关键字段。
reverse -- 排序规则设置,reverse = True表示降序,reverse = False表示升序(默认)。
同样地,使用sorted()函数也能对列表进行排序,示例如下:
list=[1,2,4,5,3]
print(sorted(list))
>>>[1,2,3,4,5]
尽管sort()和sorted()都能实现排序功能,但二者存在显著差异:
sort()与sorted()的主要区别:
sort()是列表对象的方法,仅适用于list类型;而sorted()函数适用于所有可迭代对象。
list的sort()方法直接在原列表上进行操作,不返回新列表(返回None);而内置函数sorted()则返回一个全新的排序后的列表,原列表保持不变。
此外,还可以利用列表的翻转(reverse)、升序(sort)、降序(sorted)以及按长度排序等技巧。
list4 = [10,10,50,20,30,60,51,20,10,10]
print(list4)
list4.reverse() #翻转
print(list4)
list4.sort()
print(list4) #升序排列,直接对表进行操作
list4.sort(reverse=True)
print(list4) #降序排列
list41 = [10,10,50,20,30,60,51,20,10,10]
print(sorted(list41)) #升序排列,生成一个新表
print(list41)
print(sorted(list41,reverse=True)) #降序排列,从之前的列表中挑选出元素组成新的表
print(list41)
list43 = ["fddg","gfdggfg","f"] #按照长度进行排序,生成新的列表
print(sorted(list43,key=len))
经典排序算法实现
二、使用常见排序算法进行排序
与高级内置函数类似,Python也支持通过基础语句实现各类经典排序算法。
1. 冒泡排序
冒泡排序是基础且常见的排序算法。其核心思想是相邻元素两两比较,将较大元素向后移动(正向排序)。经过一轮比较后,最大元素会沉至末尾,如同水中上升的气泡逐渐变大。
def bubble_sort(list):
count = len(list)
for i in range(count):
for j in range(i + 1, count):
if list[i] > list[j]:
list[i], list[j] = list[j], list[i]
return list
2. 选择排序
选择排序的逻辑是:第一轮遍历所有元素并与第一个元素比较,若比第一个元素大则交换,一轮结束后找到最小元素;第二轮遍历剩余元素并与第二个位置元素比较,以此类推确定后续位置元素。
def selection_sort(list):
length = len(list)
for i in range(length - 1, 0, -1):
for j in range(i):
if list[j] > list[i]:
list[j], list[i] = list[i], list[j]
return list
3. 插入排序
插入排序的核心思想是将一个新数据插入到已排好序的序列中,从而生成一个新的、元素数量加一的有序序列。该算法适用于少量数据排序,时间复杂度为O(n^2),且属于稳定排序。算法将数组分为两部分:第一部分包含所有元素但预留最后一个元素的空间,第二部分仅包含待插入元素。待第一部分排序完成后,将最后元素插入到已排序的第一部分中。
def insert_sort(list):
count = len(list)
for i in range(1, count):
key = list[i]
j = i - 1
while j >= 0:
if list[j] > key:
list[j + 1] = list[j]
list[j] = key
j -= 1
return list
4. 快速排序
快速排序的核心思想是:通过一趟排序将待排数据分割成独立的两部分,其中一部分的所有数据均小于另一部分的所有数据。随后递归地对这两部分数据分别进行快速排序,直至整个数据序列变为有序。
def quick_sort(list, left, right):
if left >= right:
return list
key = lists[left]
low = left
high = right
while left < right:
while left < right and list[right] >= key:
right -= 1
lists[left] = lists[right]
while left < right and list[left] <= key:
left += 1
list[right] = list[left]
list[right] = key
quick_sort(list, low, left - 1)
quick_sort(list, left + 1, high)
return list
lst1 = raw_input().split() #调用函数
lst = [int(i) for i in lst1]
#lst = input()
quick_sort(lst,0,len(lst)-1)
for i in range(len(lst)):
print lst[i],
5. 希尔排序
希尔排序是插入排序的高效改进版本,也称为缩小增量排序,属于非稳定排序算法。该算法由DL.Shell于1959年提出。其做法是将记录按下标的一定增量分组,对每组使用直接插入排序算法;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法随即终止。
def shell_sort(list):
count = len(list)
step = 2
group = count / step
while group > 0:
for i in range(group):
j = i + group
while j < count:
k = j - group
key = list[j]
while k >= 0:
if list[k] > key:
list[k + group] = list[k]
list[k] = key
k -= group
j += group
group /= step
return list
以上内容涵盖了Python列表排序的主要方法,希望能为读者的学习提供有益参考,欢迎继续支持本站获取更多技术资讯。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









