主页 > 开发者资讯

Python实现常见排序算法

更新: 2024-10-11 15:27:51   人气:7662
在计算机科学领域,排序算法是基础且至关重要的部分。 Python作为一门简洁、高效的语言,在实现各类常见排序算法时有着得天独厚的优势。本文将深入探讨如何使用Python来实现几种常见的排序方法,并解析其工作原理和性能特点。

首先我们从最经典的冒泡排序开始讨论:

python

def bubble_sort(arr):
n = len(arr)

for i in range(n-1):
# 每一轮遍历都可能把最大的元素"浮到顶部"
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
# 交换相邻的两个值
arr[j], arr[j + 1] = arr[j + 1], arr[j]

# 示例:
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("Sorted array:", arr)


尽管简单易懂,但冒泡排序的时间复杂度为O(n^2),对于大规模数据效率较低。

接下来考虑插入排序:

python

def insertion_sort(arr):
for index in range(1, len(arr)):

current_value = arr[index]
position = index

while(position>0 and arr[position - 1]>current_value) :
arr[position]=arr[position-1]
position-=1

arr[position]=current_value

#示例:
insertion_arr = [12, 11, 13, 5, 7 ,8 ]
insertion_sort(insertion_arr)
print ("Insertion Sorted Array : ",insertion_arr )



插入排序对小规模或者近乎有序的数据表现良好,但在最坏情况下的时间复杂性同样也是O(n^2)。

然后是快速排序,这是一种高效的分治策略排序法:

python

def quicksort(arr):
if len(arr) <= 1:
return arr

pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]

return quicksort(left) + middle + quicksort(right)

# 示例:
quicksort_list = [3,6,8,10,1,2,1]
sorted_array = quicksort(quicksort_list)
print(sorted_array)


快速排序平均情况下具有线性的分割性质(即每次都能将近似均等划分),因此它的平均时间复杂度可以达到 O(n log n)。

再来看看选择排序:

python

def selection_sort(arr):
for idx in range(len(arr)-1):

min_idx =idx

for jdx in range(idx+1,len(arr)):
if arr[min_idx]>arr[jdx]:
min_idx=jdx

arr[idx],arr[min_idx] = arr[min_idx],arr[idx]

# 示例:
selection_arr=[64, 34, 25, 12, 22, 11, 90]
selection_sort(selection_arr)
print(f'Selection sorted array is {selection_arr}')


虽然每轮循环都可以找到剩余未排好序的部分中的最小或最大项并放到正确位置上,但是整体来看,选择排序也属于O(n²)复杂度的算法。

最后提及归并排序,它也是一种基于分治思想的稳定排序算法:

python

def merge_sort(lst):
if len(lst)<=1: return lst

mid = len(lst)//2
lefthalf = merge_sort(lst[:mid])
righthalf = merge_sort(lst[mid:])

return merge(lefthalf,righthalf)


def merge(lh,rh):
mergedlist=[]
lhindex=0;
rhindex=0;

while (lhindex<len(lh))and(rhindex<len(rh)):
if lh[lhindex]<rh[rhindex]:
mergedlist.append(lh[lhindex])
lhindex+=1
else:
mergedlist.append(rh[rhindex])
rhindex+=1

mergedlist.extend(lh[lhindex:])
mergedlist.extend(rh[rhindex:])

return mergedlist


unsorted_lst =[9,5,2,7,1,6,3]
result =merge_sort(unsorted_lst)
print(result)


与快速排序不同的是,无论输入序列的状态怎样,归并排序始终保证了稳定的O(n log n) 时间复杂度。

以上五种排序算法只是众多排序技术中的一小部分,它们各自有适用场景及优缺点。理解这些基本概念有助于我们在实际开发过程中更好地运用合适的排序方式处理各种类型的问题。同时通过编写对应的Python代码实践过程也能加深对我们编程能力以及问题解决思路的理解。